mirror of
https://git.vectorsigma.ru/public/AdGuardHome.git
synced 2026-08-03 23:29:32 +00:00
Merge in DNS/adguard-home from 4923-gopacket-dhcp-vol.10 to master
Squashed commit of the following:
commit ef2106a35aadecf8340314535ec232f91ff44b50
Merge: f14e68781 f69da062e
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Jun 9 16:13:52 2025 +0300
Merge branch 'master' into 4923-gopacket-dhcp-vol.10
commit f14e687815eb66a7c161dfaa3655c41fded643a8
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Fri Jun 6 18:36:32 2025 +0300
dhcpsvc: imp code, docs
commit c94b428d6fd277a840476f02820bd065cde17d6c
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Jun 5 13:21:37 2025 +0300
dhcpsvc: imp code
commit 57eaea08e572fea41295d373b547f614a0c099ac
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Jun 4 19:48:03 2025 +0300
dhcpsvc: add methods
commit b32218848cf2a90ecfc9cc6cf12c2579bcb1a2df
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Apr 30 15:57:53 2025 +0300
dhcpsvc: add handlers
commit 615f1248160351f3bcdb040fb867d32630979d40
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jan 14 16:10:01 2025 +0300
dhcpsvc: multiplex dhcpv4
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
package dhcpsvc
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
|
"github.com/google/gopacket/layers"
|
|
)
|
|
|
|
// responseWriter4 writes DHCPv4 response to the client.
|
|
type responseWriter4 interface {
|
|
// write writes the DHCPv4 response to the client.
|
|
write(ctx context.Context, pkt *layers.DHCPv4) (err error)
|
|
}
|
|
|
|
// responseWriter6 writes DHCPv6 response to the client.
|
|
type responseWriter6 interface {
|
|
// write writes the DHCPv6 response to the client.
|
|
write(ctx context.Context, pkt *layers.DHCPv6) (err error)
|
|
}
|
|
|
|
// serve handles the incoming packets and dispatches them to the appropriate
|
|
// handler based on the Ethernet type. It's used to run in a separate goroutine
|
|
// as it blocks until packets channel is closed.
|
|
func (srv *DHCPServer) serve(ctx context.Context) {
|
|
defer slogutil.RecoverAndLog(ctx, srv.logger)
|
|
|
|
for pkt := range srv.packetSource.Packets() {
|
|
etherLayer, ok := pkt.Layer(layers.LayerTypeEthernet).(*layers.Ethernet)
|
|
if !ok {
|
|
actual := pkt.Layers()
|
|
srv.logger.DebugContext(ctx, "skipping non-ethernet packet", "layers", actual)
|
|
|
|
continue
|
|
}
|
|
|
|
var err error
|
|
|
|
switch typ := etherLayer.EthernetType; typ {
|
|
case layers.EthernetTypeIPv4:
|
|
// TODO(e.burkov): Set the response writer.
|
|
var rw responseWriter4
|
|
err = srv.serveV4(ctx, rw, pkt)
|
|
case layers.EthernetTypeIPv6:
|
|
// TODO(e.burkov): Set the response writer.
|
|
var rw responseWriter6
|
|
err = srv.serveV6(ctx, rw, pkt)
|
|
default:
|
|
// TODO(e.burkov): It seems, there is another standard for Ethernet
|
|
// header, which uses the Length field instead of the EthernetType,
|
|
// so handle it properly.
|
|
srv.logger.DebugContext(ctx, "skipping ethernet packet", "type", typ)
|
|
|
|
continue
|
|
}
|
|
|
|
if err != nil {
|
|
srv.logger.ErrorContext(ctx, "serving", slogutil.KeyError, err)
|
|
}
|
|
}
|
|
}
|