@@ -81,6 +81,7 @@ func (c *gateways) cleanup() error {
8181// Backend implements a Semtech gateway backend.
8282type Backend struct {
8383 conn * net.UDPConn
84+ txAckChan chan gw.TXAck
8485 rxChan chan gw.RXPacketBytes
8586 statsChan chan gw.GatewayStatsPacket
8687 udpSendChan chan udpPacket
@@ -105,6 +106,7 @@ func NewBackend(bind string, onNew func(lorawan.EUI64) error, onDelete func(lora
105106 b := & Backend {
106107 skipCRCCheck : skipCRCCheck ,
107108 conn : conn ,
109+ txAckChan : make (chan gw.TXAck ),
108110 rxChan : make (chan gw.RXPacketBytes ),
109111 statsChan : make (chan gw.GatewayStatsPacket ),
110112 udpSendChan : make (chan udpPacket ),
@@ -163,11 +165,17 @@ func (b *Backend) RXPacketChan() chan gw.RXPacketBytes {
163165 return b .rxChan
164166}
165167
166- // StatsChan returns the channel containg the received gateway stats.
168+ // StatsChan returns the channel containing the received gateway stats.
167169func (b * Backend ) StatsChan () chan gw.GatewayStatsPacket {
168170 return b .statsChan
169171}
170172
173+ // TXAckChan returns the channel containing the TX acknowledgements
174+ // (or errors).
175+ func (b * Backend ) TXAckChan () chan gw.TXAck {
176+ return b .txAckChan
177+ }
178+
171179// Send sends the given packet to the gateway.
172180func (b * Backend ) Send (txPacket gw.TXPacketBytes ) error {
173181 gw , err := b .gateways .get (txPacket .TXInfo .MAC )
@@ -179,6 +187,7 @@ func (b *Backend) Send(txPacket gw.TXPacketBytes) error {
179187 return err
180188 }
181189 pullResp := PullRespPacket {
190+ RandomToken : txPacket .Token ,
182191 ProtocolVersion : gw .protocolVersion ,
183192 Payload : PullRespPayload {
184193 TXPK : txpk ,
@@ -365,23 +374,10 @@ func (b *Backend) handleTXACK(addr *net.UDPAddr, data []byte) error {
365374 if err := p .UnmarshalBinary (data ); err != nil {
366375 return err
367376 }
368- var errBool bool
369377
370- logFields := log.Fields {
371- "mac" : p .GatewayMAC ,
372- "random_token" : p .RandomToken ,
373- }
374378 if p .Payload != nil {
375- if p .Payload .TXPKACK .Error != "NONE" {
376- errBool = true
377- }
378- logFields ["error" ] = p .Payload .TXPKACK .Error
379- }
380-
381- if errBool {
382- log .WithFields (logFields ).Error ("gateway: tx ack received" )
383- } else {
384- log .WithFields (logFields ).Info ("gateway: tx ack received" )
379+ txAck := newTXAckFromTXPKACK (p .GatewayMAC , p .RandomToken , p .Payload .TXPKACK )
380+ b .txAckChan <- txAck
385381 }
386382
387383 return nil
@@ -428,7 +424,6 @@ func newRXPacketsFromRXPK(mac lorawan.EUI64, rxpk RXPK) ([]gw.RXPacketBytes, err
428424 PHYPayload : b ,
429425 RXInfo : gw.RXInfo {
430426 MAC : mac ,
431- Time : time .Time (rxpk .Time ),
432427 Timestamp : rxpk .Tmst ,
433428 Frequency : int (rxpk .Freq * 1000000 ),
434429 Channel : int (rxpk .Chan ),
@@ -443,6 +438,11 @@ func newRXPacketsFromRXPK(mac lorawan.EUI64, rxpk RXPK) ([]gw.RXPacketBytes, err
443438 },
444439 }
445440
441+ if rxpk .Time != nil {
442+ ts := time .Time (* rxpk .Time )
443+ rxPacket .RXInfo .Time = & ts
444+ }
445+
446446 if len (rxpk .RSig ) == 0 {
447447 rxPackets = append (rxPackets , rxPacket )
448448 }
@@ -476,6 +476,11 @@ func newTXPKFromTXPacket(txPacket gw.TXPacketBytes) (TXPK, error) {
476476 Brd : uint8 (txPacket .TXInfo .Board ),
477477 }
478478
479+ if txPacket .TXInfo .Time != nil {
480+ ct := CompactTime (* txPacket .TXInfo .Time )
481+ txpk .Tmms = & ct
482+ }
483+
479484 if txPacket .TXInfo .DataRate .Modulation == band .FSKModulation {
480485 txpk .FDev = uint16 (txPacket .TXInfo .DataRate .BitRate / 2 )
481486 }
@@ -491,6 +496,19 @@ func newTXPKFromTXPacket(txPacket gw.TXPacketBytes) (TXPK, error) {
491496 return txpk , nil
492497}
493498
499+ func newTXAckFromTXPKACK (mac lorawan.EUI64 , token uint16 , ack TXPKACK ) gw.TXAck {
500+ var err string
501+ if ack .Error != "NONE" {
502+ err = ack .Error
503+ }
504+
505+ return gw.TXAck {
506+ MAC : mac ,
507+ Token : token ,
508+ Error : err ,
509+ }
510+ }
511+
494512func newDataRateFromDatR (d DatR ) (band.DataRate , error ) {
495513 var dr band.DataRate
496514
0 commit comments