diff --git a/internal/qol/capture/pcap.go b/internal/qol/capture/pcap.go index 8254ae7..205a990 100644 --- a/internal/qol/capture/pcap.go +++ b/internal/qol/capture/pcap.go @@ -32,7 +32,7 @@ func NewPacketCapture(iface, outputPath string) (*PacketCapture, error) { } // Open in append mode - file, err := os.OpenFile(outputPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + file, err := os.OpenFile(outputPath, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644) if err != nil { handle.Close() return nil, fmt.Errorf("create/open pcap file: %w", err) @@ -63,6 +63,8 @@ func (pc *PacketCapture) Start(ctx context.Context) error { go func() { for { select { + case <-ctx.Done(): + return case pkt, ok := <-pktCh: if !ok { return @@ -75,8 +77,6 @@ func (pc *PacketCapture) Start(ctx context.Context) error { } pc.mu.Unlock() } - case <-ctx.Done(): - return } } }() diff --git a/internal/qol/measurement.go b/internal/qol/measurement.go index da776db..7e0e0c2 100644 --- a/internal/qol/measurement.go +++ b/internal/qol/measurement.go @@ -60,7 +60,7 @@ func (r *MeasurementRunner) Run() error { } for _, upstream := range r.config.Servers { - if err := r.runMeasurement(upstream, domains, qType); err != nil { + if err := r.runPerUpstream(upstream, domains, qType); err != nil { fmt.Fprintf(os.Stderr, "error on server %s: %v\n", upstream, err) } } @@ -68,7 +68,16 @@ func (r *MeasurementRunner) Run() error { return nil } -func (r *MeasurementRunner) runMeasurement(upstream string, domains []string, qType uint16) error { +func (r *MeasurementRunner) setupDNSClient(upstream string) (client.DNSClient, error) { + opts := client.Options{ + DNSSEC: r.config.DNSSEC, + AuthoritativeDNSSEC: r.config.AuthoritativeDNSSEC, + KeepAlive: r.config.KeepAlive, + } + return client.New(upstream, opts) +} + +func (r *MeasurementRunner) runPerUpstream(upstream string, domains []string, qType uint16) error { // Setup DNS client dnsClient, err := r.setupDNSClient(upstream) if err != nil { @@ -112,21 +121,11 @@ func (r *MeasurementRunner) runMeasurement(upstream string, domains []string, qT return r.runQueries(dnsClient, upstream, domains, qType, writer, packetCapture) } -func (r *MeasurementRunner) setupDNSClient(upstream string) (client.DNSClient, error) { - opts := client.Options{ - DNSSEC: r.config.DNSSEC, - AuthoritativeDNSSEC: r.config.AuthoritativeDNSSEC, - KeepAlive: r.config.KeepAlive, - } - return client.New(upstream, opts) -} - func (r *MeasurementRunner) runQueries(dnsClient client.DNSClient, upstream string, domains []string, qType uint16, writer *results.MetricsWriter, packetCapture *capture.PacketCapture) error { ctx, cancel := context.WithCancel(context.Background()) - defer cancel() if err := packetCapture.Start(ctx); err != nil { return err @@ -163,6 +162,8 @@ func (r *MeasurementRunner) runQueries(dnsClient client.DNSClient, upstream stri } } + cancel() + time.Sleep(100 * time.Millisecond) if err := packetCapture.GetError(); err != nil {