Fix broadcast ping reply source IP, accept broadcast destinations

This commit is contained in:
Ian Gulliver
2026-04-07 12:18:07 +09:00
parent 31b2c16b07
commit b0294fada3

View File

@@ -44,6 +44,14 @@ static bool ip_match(const uint8_t* dst) {
return memcmp(dst, state.ip.data(), 4) == 0; return memcmp(dst, state.ip.data(), 4) == 0;
} }
static bool ip_match_or_broadcast(const uint8_t* dst) {
static constexpr uint8_t bcast_all[4] = {255, 255, 255, 255};
static constexpr uint8_t bcast_subnet[4] = {169, 254, 255, 255};
return ip_match(dst) ||
memcmp(dst, bcast_all, 4) == 0 ||
memcmp(dst, bcast_subnet, 4) == 0;
}
static void send_raw(const uint8_t* data, size_t len) { static void send_raw(const uint8_t* data, size_t len) {
dlog_if_slow("send_raw", 1000, [&]{ dlog_if_slow("send_raw", 1000, [&]{
w6300::ip_address dummy = {}; w6300::ip_address dummy = {};
@@ -88,7 +96,7 @@ static void handle_icmp(const uint8_t* frame, size_t len) {
if (14 + ip_total_len > len) return; if (14 + ip_total_len > len) return;
if (ip[9] != IP_PROTO_ICMP) return; if (ip[9] != IP_PROTO_ICMP) return;
if (!ip_match(ip + 16)) return; if (!ip_match_or_broadcast(ip + 16)) return;
const uint8_t* icmp = ip + ip_hdr_len; const uint8_t* icmp = ip + ip_hdr_len;
size_t icmp_len = ip_total_len - ip_hdr_len; size_t icmp_len = ip_total_len - ip_hdr_len;
@@ -106,7 +114,7 @@ static void handle_icmp(const uint8_t* frame, size_t len) {
uint8_t* rip = reply + 14; uint8_t* rip = reply + 14;
memcpy(rip, ip, ip_hdr_len); memcpy(rip, ip, ip_hdr_len);
memcpy(rip + 12, ip + 16, 4); memcpy(rip + 12, state.ip.data(), 4);
memcpy(rip + 16, ip + 12, 4); memcpy(rip + 16, ip + 12, 4);
rip[8] = 64; rip[8] = 64;
memset(rip + 10, 0, 2); memset(rip + 10, 0, 2);