|
43 | 43 | #define DHCP_OPTIONS_HEADER_SIZE 240
|
44 | 44 | /** Offset of DHCP GIADDR */
|
45 | 45 | #define DHCP_GIADDR_OFFSET 24
|
| 46 | +/** Offset of magic cookie */ |
| 47 | +#define MAGIC_COOKIE_OFFSET 236 |
46 | 48 | #define CLIENT_IF_PREFIX "Ethernet"
|
| 49 | +/** 32-bit decimal of 99.130.83.99 (indicate DHCP packets), Refer to RFC 2131 */ |
| 50 | +#define DHCP_MAGIC_COOKIE 1669485411 |
47 | 51 |
|
48 | 52 | #define OP_LDHA (BPF_LD | BPF_H | BPF_ABS) /** bpf ldh Abs */
|
49 | 53 | #define OP_LDHI (BPF_LD | BPF_H | BPF_IND) /** bpf ldh Ind */
|
@@ -288,7 +292,14 @@ static void client_packet_handler(dhcp_device_context_t *context, uint8_t *buffe
|
288 | 292 | ntohs(udp->len) : buffer_sz - UDP_START_OFFSET - sizeof(struct udphdr);
|
289 | 293 | int dhcp_option_sz = dhcp_sz - DHCP_OPTIONS_HEADER_SIZE;
|
290 | 294 | const u_char *dhcp_option = buffer + dhcp_option_offset;
|
291 |
| - |
| 295 | + uint32_t magic_cookie = dhcphdr[MAGIC_COOKIE_OFFSET] << 24 | dhcphdr[MAGIC_COOKIE_OFFSET + 1] << 16 | |
| 296 | + dhcphdr[MAGIC_COOKIE_OFFSET + 2] << 8 | dhcphdr[MAGIC_COOKIE_OFFSET + 3]; |
| 297 | + // If magic cookie not equals to DHCP value, its format is not DHCP format, shouldn't count as DHCP packets. |
| 298 | + if (magic_cookie != DHCP_MAGIC_COOKIE) { |
| 299 | + context->counters[DHCP_COUNTERS_CURRENT][dir][BOOTP_MESSAGE]++; |
| 300 | + aggregate_dev.counters[DHCP_COUNTERS_CURRENT][dir][BOOTP_MESSAGE]++; |
| 301 | + return; |
| 302 | + } |
292 | 303 | int offset = 0;
|
293 | 304 | while ((offset < (dhcp_option_sz + 1)) && dhcp_option[offset] != 255) {
|
294 | 305 | if (dhcp_option[offset] == OPTION_DHCP_MESSAGE_TYPE) {
|
|
0 commit comments