Thanks @muxx for sharing your findings.
Running a Mikrotik router/AP and an OpenWrt wireless bridge, after RouterOS upgrade to 6.47 I found myself in exact same situation as you describe. DHCP packets from the server are now coming with a unicast L2 address and are not relayed.
Judging from sources,
relayd indeed only watches for DHCP packets with broadcast or multicast addresses. I don't feel up to devising a fix, maybe we could file a feature request.
Anyway, my current solution is to stop relying on
relayd's DHCP capabilities and use a standalone DHCP relay. There are multiple implementations to choose from, I went for
dnsmasq as it's already installed and well integrated (ready with init.d script etc.)
First step is to run
relayd without the
-D parameter. Can be done in
config interface 'sta_bridge' option proto 'relay' option network 'lan wwan' ... option forward_dhcp 0 # add this
dnsmasq as DHCP relay. This is how my
/etc/config/dhcp looks like:
config dnsmasq option port '0' # optional, disable dnsmasq's DNS server, I don't need it config relay option interface 'wwan' option local_addr '192.168.2.1' # lan interface address option server_addr '192.168.1.1' # the actual dhcp server address # the rest is only needed for IPv6 (odhcpd) config dhcp 'lan' option interface 'lan' option dhcpv4 'disabled' option ra 'relay' option ndp 'relay' option dhcpv6 'relay' config dhcp 'wwan' option interface 'wwan' option dhcpv4 'disabled' option ra 'relay' option ndp 'relay' option dhcpv6 'relay' option master '1'
The final step is to make sure the real DHCP server accepts requests from relay agents. On Mikrotik I did:
/ip dhcp-server set defconf relay=255.255.255.255)
Hope this helps anyone.