@@ -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
209219func (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