Fix broadcast ping reply source IP, accept broadcast destinations
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user