From d610eff67486a955015996625217494f4d13db75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ribal=20del=20R=C3=ADo?= Date: Thu, 5 Mar 2026 18:18:37 +0100 Subject: [PATCH 1/2] feat:(backend): remove sniffer --- .../pkg/transport/network/sniffer/decoder.go | 47 --- .../transport/network/sniffer/decoder_test.go | 124 -------- .../pkg/transport/network/sniffer/sniffer.go | 141 --------- .../transport/network/sniffer/sniffer_test.go | 82 ----- backend/pkg/transport/session/sniffer.go | 102 ------ backend/pkg/transport/session/sniffer_test.go | 296 ------------------ backend/pkg/transport/transport.go | 13 - backend/pkg/transport/transport_test.go | 41 --- 8 files changed, 846 deletions(-) delete mode 100644 backend/pkg/transport/network/sniffer/decoder.go delete mode 100644 backend/pkg/transport/network/sniffer/decoder_test.go delete mode 100644 backend/pkg/transport/network/sniffer/sniffer.go delete mode 100644 backend/pkg/transport/network/sniffer/sniffer_test.go delete mode 100644 backend/pkg/transport/session/sniffer.go delete mode 100644 backend/pkg/transport/session/sniffer_test.go diff --git a/backend/pkg/transport/network/sniffer/decoder.go b/backend/pkg/transport/network/sniffer/decoder.go deleted file mode 100644 index 3fffe7b56..000000000 --- a/backend/pkg/transport/network/sniffer/decoder.go +++ /dev/null @@ -1,47 +0,0 @@ -package sniffer - -import ( - "github.com/google/gopacket" - "github.com/google/gopacket/layers" -) - -type decoder struct { - eth layers.Ethernet - ipv4 layers.IPv4 - ipipv4 layers.IPv4 - tcp layers.TCP - udp layers.UDP - payload gopacket.Payload - - parser *gopacket.DecodingLayerParser -} - -func newDecoder(first gopacket.LayerType) *decoder { - dec := new(decoder) - dec.parser = gopacket.NewDecodingLayerParser(first, &dec.eth, &dec.ipv4, &dec.ipipv4, &dec.tcp, &dec.udp, &dec.payload) - dec.parser.IgnoreUnsupported = true - return dec - -} - -func (dec *decoder) decode(data []byte) ([]gopacket.LayerType, error) { - decoded := []gopacket.LayerType{} - err := dec.parser.DecodeLayers(data, &decoded) - return decoded, err -} - -func (dec *decoder) IPv4() layers.IPv4 { - return dec.ipipv4 -} - -func (dec *decoder) UDP() layers.UDP { - return dec.udp -} - -func (dec *decoder) TCP() layers.TCP { - return dec.tcp -} - -func (dec *decoder) Payload() []byte { - return dec.payload -} diff --git a/backend/pkg/transport/network/sniffer/decoder_test.go b/backend/pkg/transport/network/sniffer/decoder_test.go deleted file mode 100644 index 826a5f709..000000000 --- a/backend/pkg/transport/network/sniffer/decoder_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package sniffer - -import ( - "log" - "testing" - - "github.com/google/gopacket/layers" - "github.com/google/gopacket/pcap" -) - -const ( - IPinIPCap = "../../../../captures/IP_in_IP.cap" - IPCap = "../../../../captures/path_MTU_discovery.cap" -) - -// TestIPinIP tests that IPinIP packets are handled correctly, returning the addresses -// of the inner IP packet (the original one) -func TestIPinIP(t *testing.T) { - type testCase struct { - name string - lip string - rip string - } - - expected := []testCase{ - {"first", "1.1.1.1", "2.2.2.2"}, - {"second", "2.2.2.2", "1.1.1.1"}, - {"third", "1.1.1.1", "2.2.2.2"}, - {"fourth", "2.2.2.2", "1.1.1.1"}, - {"fifth", "1.1.1.1", "2.2.2.2"}, - {"sixth", "2.2.2.2", "1.1.1.1"}, - {"seventh", "1.1.1.1", "2.2.2.2"}, - {"eight", "2.2.2.2", "1.1.1.1"}, - {"ninth", "1.1.1.1", "2.2.2.2"}, - {"tenth", "2.2.2.2", "1.1.1.1"}, - } - - source, err := pcap.OpenOffline(IPinIPCap) - if err != nil { - t.Fatalf("error opening capture: %s", err) - } - - decoder := newDecoder(layers.LayerTypeEthernet) - - for _, test := range expected { - t.Run(test.name, func(t *testing.T) { - data, _, err := source.ReadPacketData() - if err != nil { - t.Fatalf("error reading packet: %s", err) - } - - layers, err := decoder.decode(data) - if err != nil { - t.Fatalf("error decoding packet: %s", err) - } - - log.Printf("%v\n", layers) - - ip := decoder.IPv4() - - if ip.SrcIP.String() != test.lip { - t.Fatalf("source IPIP for the packet is different (%s != %s)", ip.SrcIP, test.lip) - } - - if ip.DstIP.String() != test.rip { - t.Fatalf("destination IPIP for the packet is different (%s != %s)", ip.DstIP, test.rip) - } - }) - } -} - -// TestIp tests that regular IP packets, with just one IP header, are also read correctly and the intended -// addresses are read from it. -func TestIP(t *testing.T) { - type testCase struct { - name string - lip string - rip string - } - - expected := []testCase{ - {"first", "192.168.0.2", "192.168.1.2"}, - {"second", "192.168.0.1", "192.168.0.2"}, - {"third", "192.168.0.2", "192.168.1.2"}, - {"fourth", "192.168.0.1", "192.168.0.2"}, - {"fifth", "192.168.0.2", "192.168.1.2"}, - {"sixth", "192.168.0.1", "192.168.0.2"}, - {"seventh", "192.168.0.2", "192.168.1.2"}, - {"eight", "192.168.1.2", "192.168.0.2"}, - } - - source, err := pcap.OpenOffline(IPCap) - if err != nil { - t.Fatalf("error opening capture: %s", err) - } - - decoder := newDecoder(layers.LayerTypeEthernet) - - for _, test := range expected { - t.Run(test.name, func(t *testing.T) { - data, _, err := source.ReadPacketData() - if err != nil { - t.Fatalf("error reading packet: %s", err) - } - - layers, err := decoder.decode(data) - if err != nil { - t.Fatalf("error decoding packet: %s", err) - } - - log.Printf("%v\n", layers) - - ip := decoder.IPv4() - - if ip.SrcIP.String() != test.lip { - t.Fatalf("source IP for the packet is different (%s != %s)", ip.SrcIP, test.lip) - } - - if ip.DstIP.String() != test.rip { - t.Fatalf("destination IP for the packet is different (%s != %s)", ip.DstIP, test.rip) - } - }) - } -} diff --git a/backend/pkg/transport/network/sniffer/sniffer.go b/backend/pkg/transport/network/sniffer/sniffer.go deleted file mode 100644 index b7929c867..000000000 --- a/backend/pkg/transport/network/sniffer/sniffer.go +++ /dev/null @@ -1,141 +0,0 @@ -package sniffer - -import ( - "fmt" - - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/google/gopacket" - "github.com/google/gopacket/layers" - "github.com/google/gopacket/pcap" - "github.com/rs/zerolog" -) - -// Sniffer provides a way to capture packets from the wire. It handles both capture -// and analysis to provide only the payload of the packets, instead of the raw bytes. -type Sniffer struct { - source *pcap.Handle - decoder *decoder - - logger zerolog.Logger -} - -// New creates a new sniffer from the provided source. -// -// source is a previously created pcap handle that will capture packets from the wire or a save file. -// -// firstLayer, when set to something, will be used as the firstLayer for the packet decoder. When this -// value is nil, the program tries to automatically detect the first layer from the source. -// -// The provided source should be already configured and ready to use, with the appropiate filters. -func New(source *pcap.Handle, firstLayer *gopacket.LayerType, baseLogger zerolog.Logger) *Sniffer { - first := source.LinkType().LayerType() - if firstLayer != nil { - first = *firstLayer - } - decoder := newDecoder(first) - - logger := baseLogger.Sample(zerolog.LevelSampler{ - TraceSampler: zerolog.RandomSampler(50000), - DebugSampler: zerolog.RandomSampler(25000), - InfoSampler: zerolog.RandomSampler(1), - WarnSampler: zerolog.RandomSampler(1), - ErrorSampler: zerolog.RandomSampler(1), - }) - - sniffer := &Sniffer{ - source: source, - decoder: decoder, - - logger: logger, - } - - return sniffer -} - -// ReadNext pulls the next packet from the wire, decodes it and returns the payload obtained. -func (sniffer *Sniffer) ReadNext() (network.Payload, error) { - data, captureInfo, err := sniffer.source.ReadPacketData() - if err != nil { - sniffer.logger.Error().Stack().Err(err).Msg("read source") - return network.Payload{}, err - } - - packetLayers, err := sniffer.decoder.decode(data) - if err != nil { - sniffer.logger.Error().Stack().Err(err).Msg("decode layers") - return network.Payload{}, err - } - - socket := network.Socket{ - SrcIP: "", - SrcPort: 0, - DstIP: "", - DstPort: 0, - } - - gotPorts := false - gotIp := false - layerArr := zerolog.Arr() - payloadData := []byte{} - for _, layer := range packetLayers { - if !gotIp && layer == layers.LayerTypeIPv4 { - ip := sniffer.decoder.IPv4() - socket.SrcIP = ip.SrcIP.String() - socket.DstIP = ip.DstIP.String() - gotIp = true - } else if !gotPorts { - switch layer { - case layers.LayerTypeUDP: - udp := sniffer.decoder.UDP() - socket.SrcPort = uint16(udp.SrcPort) - socket.DstPort = uint16(udp.DstPort) - gotPorts = true - case layers.LayerTypeTCP: - tcp := sniffer.decoder.TCP() - socket.SrcPort = uint16(tcp.SrcPort) - socket.DstPort = uint16(tcp.DstPort) - gotPorts = true - } - } - - if layer == gopacket.LayerTypePayload { - payloadData = sniffer.decoder.Payload() - } - - layerArr = layerArr.Str(layer.String()) - } - - if !gotIp || !gotPorts { - sniffer.logger.Debug().Array( - "layers", layerArr, - ).Bool( - "has ip", gotIp, - ).Bool( - "has ports", gotPorts, - ).Msg("missing layers") - return network.Payload{}, ErrMissingLayers{packetLayers} - } - - sniffer.logger.Debug().Array( - "layers", layerArr, - ).Str( - "from", fmt.Sprintf("%s:%d", socket.SrcIP, socket.SrcPort), - ).Str( - "to", fmt.Sprintf("%s:%d", socket.DstIP, socket.DstPort), - ).Time( - "capture", captureInfo.Timestamp, - ).Msg("packet") - - return network.Payload{ - Socket: socket, - Data: payloadData, - Timestamp: captureInfo.Timestamp, - }, nil -} - -// Close closes the underlying packet capture handle and cleans up any left over data. -func (sniffer *Sniffer) Close() { - sniffer.logger.Info().Msg("closing") - - sniffer.source.Close() -} diff --git a/backend/pkg/transport/network/sniffer/sniffer_test.go b/backend/pkg/transport/network/sniffer/sniffer_test.go deleted file mode 100644 index 2966fec4b..000000000 --- a/backend/pkg/transport/network/sniffer/sniffer_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package sniffer_test - -import ( - "io" - "testing" - - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer" - "github.com/google/gopacket/layers" - "github.com/google/gopacket/pcap" - "github.com/rs/zerolog" -) - -const ( - SnifferCap = "../../../../captures/telnet.cap" - SnifferFilter = "tcp port 23 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" -) - -func TestSniffer(t *testing.T) { - type testCase struct { - name string - socket network.Socket - payload []byte - } - - socketA := network.Socket{ - SrcIP: "192.168.1.140", - SrcPort: 56760, - DstIP: "192.168.1.194", - DstPort: 23, - } - - socketB := network.Socket{ - SrcIP: "192.168.1.194", - SrcPort: 23, - DstIP: "192.168.1.140", - DstPort: 56760, - } - - expected := []testCase{ - {"first", socketA, []byte("\xff\xfd\x03\xff\xfb\x18\xff\xfb\x1f\xff\xfb\x20\xff\xfb\x21\xff\xfb\x22\xff\xfb\x27\xff\xfd\x05\xff\xfb\x23")}, - {"second", socketB, []byte("\xff\xfd\x18\xff\xfd\x20\xff\xfd\x23\xff\xfd\x27")}, - {"third", socketB, []byte("\xff\xfb\x03\xff\xfd\x1f\xff\xfd\x21\xff\xfe\x22\xff\xfb\x05\xff\xfa\x20\x01\xff\xf0\xff\xfa\x23\x01\xff\xf0\xff\xfa\x27\x01\xff\xf0\xff\xfa\x18\x01\xff\xf0")}, - {"fourth", socketA, []byte("\xff\xfa\x1f\x00\x50\x00\x18\xff\xf0\xff\xfa\x20\x00\x33\x38\x34\x30\x30\x2c\x33\x38\x34\x30\x30\xff\xf0\xff\xfa\x23\x00\x53\x61\x6e\x64\x62\x6f\x78\x3a\x30\x2e\x30\xff\xf0\xff\xfa\x27\x00\x00\x44\x49\x53\x50\x4c\x41\x59\x01\x53\x61\x6e\x64\x62\x6f\x78\x3a\x30\x2e\x30\xff\xf0\xff\xfa\x18\x00\x78\x74\x65\x72\x6d\xff\xf0")}, - {"fifth", socketB, []byte("\xff\xfd\x01")}, - {"sixth", socketA, []byte("\xff\xfc\x01")}, - {"seventh", socketB, []byte("\xff\xfb\x01")}, - {"eigth", socketA, []byte("\xff\xfd\x01")}, - {"ninth", socketB, []byte("\x6c\x6f\x67\x69\x6e\x3a\x20")}, - } - source, err := pcap.OpenOffline(SnifferCap) - if err != nil { - t.Fatalf("error opening source: %s", err) - } - - err = source.SetBPFFilter(SnifferFilter) - if err != nil { - t.Fatalf("error setting filter: %s", err) - } - - first := layers.LayerTypeEthernet - nullLogger := zerolog.New(io.Discard) - sniffer := sniffer.New(source, &first, nullLogger) - defer sniffer.Close() - - for _, test := range expected { - t.Run(test.name, func(t *testing.T) { - data, err := sniffer.ReadNext() - if err != nil { - t.Fatalf("error reading packet: %s", err) - } - - if data.Socket != test.socket { - t.Fatalf("returned socket does not match expected (%v != %v)", data.Socket, test.socket) - } - - if string(data.Data) != string(test.payload) { - t.Fatalf("returned payload does not match expected (%v != %v)", data.Data, test.payload) - } - }) - } -} diff --git a/backend/pkg/transport/session/sniffer.go b/backend/pkg/transport/session/sniffer.go deleted file mode 100644 index 25cf16d17..000000000 --- a/backend/pkg/transport/session/sniffer.go +++ /dev/null @@ -1,102 +0,0 @@ -package session - -import ( - "errors" - "fmt" - "io" - - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer" - "github.com/rs/zerolog" -) - -const defaultBufferSize = 4096 - -// conversationCallback is called when a new conversation is detected, the conversation socket, -// as well as the reader to get its packets, is provided through this callback. -type conversationCallback = func(socket network.Socket, reader io.Reader) - -// packetReader is a reader that generates packets from network connections -type packetReader interface { - ReadNext() (network.Payload, error) -} - -// Sniffer demux is a helper that takes all packets returned by the Sniffer and splits their -// contents onto buffers based on the source and destination IPs and ports -type SnifferDemux struct { - conversations map[network.Socket]io.Writer - - onConversation conversationCallback - errorChan chan<- error - - logger zerolog.Logger -} - -// NewSnifferDemux creates a new SnifferDemux with the provided onConversation callback -func NewSnifferDemux(onConversation conversationCallback, baseLogger zerolog.Logger) (*SnifferDemux, <-chan error) { - logger := baseLogger.Sample(zerolog.LevelSampler{ - TraceSampler: zerolog.RandomSampler(25000), - DebugSampler: zerolog.RandomSampler(1), - InfoSampler: zerolog.RandomSampler(1), - WarnSampler: zerolog.RandomSampler(1), - ErrorSampler: zerolog.RandomSampler(1), - }) - - errorChan := make(chan error) - - return &SnifferDemux{ - conversations: make(map[network.Socket]io.Writer), - - onConversation: onConversation, - errorChan: errorChan, - - logger: logger, - }, errorChan -} - -// ReadPackets consumes the provided PacketReader. -// -// ReadPackets will block until an error is returned, callers are advised to run this -// in a goroutine. -func (demux *SnifferDemux) ReadPackets(reader packetReader) { - for { - payload, err := reader.ReadNext() - if err != nil { - if errors.Is(err, io.EOF) { - close(demux.errorChan) - return - } - - if _, ok := err.(sniffer.ErrMissingLayers); ok { - continue - } - demux.logger.Error().Stack().Err(err).Msg("read next") - demux.errorChan <- err - continue - } - payloadLogger := demux.logger.With().Str( - "from", fmt.Sprintf("%s:%d", payload.Socket.SrcIP, payload.Socket.SrcPort), - ).Str( - "to", fmt.Sprintf("%s:%d", payload.Socket.DstIP, payload.Socket.DstPort), - ).Logger() - - payloadLogger.Trace().Time("capture", payload.Timestamp).Msg("read next") - - conversation, ok := demux.conversations[payload.Socket] - if !ok { - payloadLogger.Debug().Int("buffer size", defaultBufferSize).Msg("new conversation") - buffer := NewBuffer(defaultBufferSize) - demux.conversations[payload.Socket] = buffer - conversation = buffer - demux.onConversation(payload.Socket, buffer) - } - - _, err = conversation.Write(payload.Data) - if err != nil { - payloadLogger.Error().Stack().Err(err).Msg("write") - delete(demux.conversations, payload.Socket) - demux.errorChan <- err - continue - } - } -} diff --git a/backend/pkg/transport/session/sniffer_test.go b/backend/pkg/transport/session/sniffer_test.go deleted file mode 100644 index 2be02af06..000000000 --- a/backend/pkg/transport/session/sniffer_test.go +++ /dev/null @@ -1,296 +0,0 @@ -package session_test - -import ( - "errors" - "io" - "sync" - "testing" - "time" - - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/session" - "github.com/rs/zerolog" -) - -type testInputChunk struct { - socket network.Socket - data string -} - -type testInput []testInputChunk - -type testInputAdapter struct { - chunks testInput - curr int -} - -func (input *testInputAdapter) ReadNext() (network.Payload, error) { - if input.curr >= len(input.chunks) { - return network.Payload{}, errors.New("no more packets to read") - } - - chunk := input.chunks[input.curr] - input.curr++ - return network.Payload{ - Socket: chunk.socket, - Data: []byte(chunk.data), - Timestamp: time.Now(), - }, nil -} - -type testOutput = map[network.Socket]string - -type testcase struct { - name string - input testInput - output testOutput -} - -func TestSnifferDemux(t *testing.T) { - - tests := []testcase{ - { - name: "basic message", - input: testInput{ - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "Hello, world!", - }, - }, - output: testOutput{ - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "Hello, world!", - }, - }, - { - name: "multiple messages", - input: testInput{ - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "a", - }, - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "b", - }, - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "c", - }, - }, - output: testOutput{ - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "abc", - }, - }, - { - name: "multiple sockets", - input: testInput{ - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "a", - }, - { - network.Socket{ - SrcIP: "127.0.0.2", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "b", - }, - { - network.Socket{ - SrcIP: "127.0.0.3", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "c", - }, - }, - output: testOutput{ - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "a", - network.Socket{ - SrcIP: "127.0.0.2", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "b", - network.Socket{ - SrcIP: "127.0.0.3", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "c", - }, - }, - { - name: "multiple sockets, multiple messages", - input: testInput{ - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "a", - }, - { - network.Socket{ - SrcIP: "127.0.0.2", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "b", - }, - { - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }, - "c", - }, - }, - output: testOutput{ - network.Socket{ - SrcIP: "127.0.0.1", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "ac", - network.Socket{ - SrcIP: "127.0.0.2", - SrcPort: 3000, - DstIP: "127.0.0.1", - DstPort: 3001, - }: "b", - }, - }, - } - - for _, test := range tests { - t.Run(t.Name(), func(t *testing.T) { - mapMx := new(sync.Mutex) - outputMap := make(map[network.Socket]string) - - wg := new(sync.WaitGroup) - onConversation := func(socket network.Socket, reader io.Reader) { - wg.Add(1) - go func(socket network.Socket, reader io.Reader) { - defer wg.Done() - buf := make([]byte, 65536) - timeout := time.After(time.Millisecond) - readChan := make(chan []byte) - for { - go func() { - for { - n, err := reader.Read(buf) - if err != nil { - close(readChan) - return - } - if n > 0 { - readChan <- buf[:n] - return - } - } - }() - - select { - case <-timeout: - return - case buf, ok := <-readChan: - if !ok { - return - } - mapMx.Lock() - data := string(buf) - prev, ok := outputMap[socket] - if ok { - data = prev + data - } - outputMap[socket] = data - mapMx.Unlock() - } - - } - }(socket, reader) - } - - nullLogger := zerolog.New(io.Discard) - demux, err := session.NewSnifferDemux(onConversation, nullLogger) - - data := testInputAdapter{test.input, 0} - - go demux.ReadPackets(&data) - <-err - wg.Wait() - - if len(outputMap) > len(test.output) { - for socket, got := range outputMap { - if _, ok := test.output[socket]; !ok { - t.Fatalf("Unexpected message from socket %v: %s", socket, got) - } - expected := test.output[socket] - if expected != got { - t.Fatalf("expected != got for socket %v: (\"%s\" != \"%s\")", socket, expected, got) - } - } - } else { - for socket, expected := range test.output { - if _, ok := outputMap[socket]; !ok { - t.Fatalf("Expected message from socket %v: %s", socket, expected) - } - got := outputMap[socket] - if expected != got { - t.Fatalf("expected != got for socket %v: (\"%s\" != \"%s\")", socket, expected, got) - } - } - } - - }) - } -} diff --git a/backend/pkg/transport/transport.go b/backend/pkg/transport/transport.go index d4020a5d6..b8950cde2 100644 --- a/backend/pkg/transport/transport.go +++ b/backend/pkg/transport/transport.go @@ -11,13 +11,11 @@ import ( "github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tftp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/udp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/data" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/presentation" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/session" "github.com/rs/zerolog" ) @@ -374,17 +372,6 @@ func (transport *Transport) handlePacketEvent(message PacketMessage) error { return nil } -// HandleSniffer starts listening for packets on the provided sniffer and handles them. -// -// This function will block until the sniffer is closed -func (transport *Transport) HandleSniffer(sniffer *sniffer.Sniffer) { - demux, errChan := session.NewSnifferDemux(transport.handleConversation, transport.logger) - go demux.ReadPackets(sniffer) - for err := range errChan { - transport.errChan <- err - } -} - // HandleUDPServer starts listening for packets on the provided UDP server and handles them. // // This function will block until the server is closed diff --git a/backend/pkg/transport/transport_test.go b/backend/pkg/transport/transport_test.go index 8cde13a44..effe41745 100644 --- a/backend/pkg/transport/transport_test.go +++ b/backend/pkg/transport/transport_test.go @@ -7,7 +7,6 @@ import ( "fmt" "io" "net" - "os" "strings" "sync" "testing" @@ -15,15 +14,11 @@ import ( "github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network" - "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tftp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/udp" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/data" "github.com/HyperloopUPV-H8/h9-backend/pkg/transport/presentation" - "github.com/google/gopacket/layers" - "github.com/google/gopacket/pcap" - "github.com/google/gopacket/pcapgo" "github.com/rs/zerolog" ) @@ -999,42 +994,6 @@ func TestHandleUDPServer_Dispatches(t *testing.T) { } } -func TestHandleSniffer_Dispatches(t *testing.T) { - tr, api := createTestTransport(t) - - // empty pcap (header only) to drive HandleSniffer through EOF path - tmp, err := os.CreateTemp("", "sniffer*.pcap") - if err != nil { - t.Fatalf("failed to create temp file: %v", err) - } - writer := pcapgo.NewWriter(tmp) - if err := writer.WriteFileHeader(65535, layers.LinkTypeEthernet); err != nil { - t.Fatalf("write header failed: %v", err) - } - tmp.Close() - - handle, err := pcap.OpenOffline(tmp.Name()) - if err != nil { - t.Fatalf("failed to open pcap: %v", err) - } - sn := sniffer.New(handle, nil, defaultLogger()) - - done := make(chan struct{}) - go func() { - tr.HandleSniffer(sn) - close(done) - }() - - select { - case <-done: - case <-time.After(2 * time.Second): - t.Fatalf("HandleSniffer did not return on EOF") - } - - // No notifications expected; just ensure no panic/block. - _ = api -} - func TestHandleConversation_DispatchesAndStopsOnError(t *testing.T) { tr, api := createTestTransport(t) From 296ce53a90f0498c6b55ab688ad8644eed35ae75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ribal=20del=20R=C3=ADo?= Date: Thu, 5 Mar 2026 18:23:44 +0100 Subject: [PATCH 2/2] feat: remove pcap --- .github/new_unfinished_workflows/build.yaml | 5 +---- .github/workflows/build.yaml | 5 +---- .github/workflows/go_test.yaml | 5 ++--- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/new_unfinished_workflows/build.yaml b/.github/new_unfinished_workflows/build.yaml index 585f0c304..f704c3f2a 100644 --- a/.github/new_unfinished_workflows/build.yaml +++ b/.github/new_unfinished_workflows/build.yaml @@ -301,11 +301,8 @@ jobs: - name: Install Linux dependencies if: runner.os == 'Linux' && steps.check-artifact.outputs.needs_build == 'true' - run: sudo apt-get update && sudo apt-get install -y libpcap-dev gcc + run: sudo apt-get update && sudo apt-get install -y gcc - - name: Install macOS dependencies - if: runner.os == 'macOS' && steps.check-artifact.outputs.needs_build == 'true' - run: brew install libpcap - name: Build backend (Linux) if: runner.os == 'Linux' && steps.check-artifact.outputs.needs_build == 'true' diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 516ddbdc7..4b4f8571d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -130,11 +130,8 @@ jobs: - name: Install Linux Deps if: runner.os == 'Linux' && steps.download.outcome != 'success' - run: sudo apt-get update && sudo apt-get install -y libpcap-dev gcc + run: sudo apt-get update && sudo apt-get install -y gcc - - name: Install macOS Deps - if: runner.os == 'macOS' && steps.download.outcome != 'success' - run: brew install libpcap - name: Build Binary if: steps.download.outcome != 'success' diff --git a/.github/workflows/go_test.yaml b/.github/workflows/go_test.yaml index 857e6f849..c859b9bd8 100644 --- a/.github/workflows/go_test.yaml +++ b/.github/workflows/go_test.yaml @@ -21,9 +21,8 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.23' - - name: Install libpcap - run: sudo apt-get update && sudo apt-get install -y libpcap-dev + go-version: '1.23' + - name: Download dependencies run: go mod download