Skip to content

Commit 4b8bd2b

Browse files
authored
Merge branch 'develop' into backend/updater
2 parents 6bdd740 + b9463b7 commit 4b8bd2b

6 files changed

Lines changed: 70 additions & 4 deletions

File tree

backend/cmd/config.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ type Network struct {
1414
Manual bool
1515
}
1616

17+
type Transport struct {
18+
PropagateFault bool
19+
}
20+
1721
type Config struct {
18-
Vehicle vehicle.Config
19-
Server server.Config
20-
Adj Adj
21-
Network Network
22+
Vehicle vehicle.Config
23+
Server server.Config
24+
Adj Adj
25+
Network Network
26+
Transport Transport
2227
}

backend/cmd/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,5 @@ branch = "main" # Leave blank when using ADJ as a submodule (like this: "")
2323
test = true
2424
[network]
2525
manual = false
26+
[transport]
27+
propagate_fault = true

backend/cmd/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ func main() {
327327

328328
// <--- transport --->
329329
transp := transport.NewTransport(trace.Logger)
330+
transp.SetpropagateFault(config.Transport.PropagateFault)
330331

331332
// <--- vehicle --->
332333
ipToBoardId := make(map[string]abstraction.BoardId)

backend/internal/adj/git.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package adj
22

33
import (
4+
"log"
45
"os"
56
"path/filepath"
67

@@ -35,6 +36,7 @@ func updateRepo(AdjBranch string) error {
3536
_, err = git.PlainClone(tempPath, false, cloneOptions)
3637
if err != nil {
3738
// If the clone fails, work with the local ADJ
39+
log.Printf("Warning: Could not clone ADJ branch '%s' from remote. Working with local ADJ. Error: %v", AdjBranch, err)
3840
return nil
3941
}
4042

backend/pkg/adj/git.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package adj
22

33
import (
4+
"log"
45
"os"
56
"path/filepath"
67

@@ -35,6 +36,7 @@ func updateRepo(AdjBranch string) error {
3536
_, err = git.PlainClone(tempPath, false, cloneOptions)
3637
if err != nil {
3738
// If the clone fails, work with the local ADJ
39+
log.Printf("Warning: Could not clone ADJ branch '%s' from remote. Working with local ADJ. Error: %v", AdjBranch, err)
3840
return nil
3941
}
4042

backend/pkg/transport/transport.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ type Transport struct {
3636

3737
tftp *tftp.Client
3838

39+
propagateFault bool
40+
3941
api abstraction.TransportAPI
4042

4143
logger zerolog.Logger
@@ -170,6 +172,14 @@ func (transport *Transport) handleTCPConn(conn net.Conn) error {
170172
return
171173
}
172174

175+
if transport.propagateFault && packet.Id() == 0 {
176+
connectionLogger.Info().Msg("replicating packet with id 0 to all boards")
177+
err := transport.handlePacketEvent(NewPacketMessage(packet))
178+
if err != nil {
179+
connectionLogger.Error().Err(err).Msg("failed to replicate packet")
180+
}
181+
}
182+
173183
from := conn.RemoteAddr().String()
174184
to := conn.LocalAddr().String()
175185

@@ -208,6 +218,37 @@ func (transport *Transport) SendMessage(message abstraction.TransportMessage) er
208218
// handlePacketEvent is used to send an order to one of the connected boards
209219
func (transport *Transport) handlePacketEvent(message PacketMessage) error {
210220
eventLogger := transport.logger.With().Str("type", fmt.Sprintf("%T", message.Packet)).Uint16("id", uint16(message.Id())).Logger()
221+
222+
if message.Id() == 0 {
223+
eventLogger.Info().Msg("broadcasting packet id 0")
224+
data, err := transport.encoder.Encode(message.Packet)
225+
if err != nil {
226+
eventLogger.Error().Stack().Err(err).Msg("encode")
227+
transport.errChan <- err
228+
return err
229+
}
230+
231+
transport.connectionsMx.Lock()
232+
defer transport.connectionsMx.Unlock()
233+
for target, conn := range transport.connections {
234+
eventLogger := eventLogger.With().Str("target", string(target)).Logger()
235+
236+
totalWritten := 0
237+
for totalWritten < len(data) {
238+
n, err := conn.Write(data[totalWritten:])
239+
eventLogger.Trace().Int("amount", n).Msg("written chunk")
240+
totalWritten += n
241+
if err != nil {
242+
eventLogger.Error().Stack().Err(err).Msg("write")
243+
transport.errChan <- err
244+
return err
245+
}
246+
}
247+
eventLogger.Info().Msg("sent")
248+
}
249+
return nil
250+
}
251+
211252
target, ok := transport.idToTarget[message.Id()]
212253
if !ok {
213254
eventLogger.Debug().Msg("target not found")
@@ -299,6 +340,15 @@ func (transport *Transport) handleConversation(socket network.Socket, reader io.
299340
return
300341
}
301342

343+
// Intercept packets with id == 0 and replicate
344+
if transport.propagateFault && packet.Id() == 0 {
345+
conversationLogger.Info().Msg("replicating packet with id 0 to all boards")
346+
err := transport.handlePacketEvent(NewPacketMessage(packet))
347+
if err != nil {
348+
conversationLogger.Error().Err(err).Msg("failed to replicate packet")
349+
}
350+
}
351+
302352
transport.api.Notification(NewPacketNotification(packet, srcAddr, dstAddr, time.Now()))
303353
}
304354
}()
@@ -322,3 +372,7 @@ func (transport *Transport) SendFault() {
322372
// transport.errChan <- err
323373
// }
324374
}
375+
376+
func (transport *Transport) SetpropagateFault(enabled bool) {
377+
transport.propagateFault = enabled
378+
}

0 commit comments

Comments
 (0)