6 static uint8_t hexalpha
[] = "0123456789ABCDEF";
7 const uint8_t broadcast
[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
9 bool compare_mac(const uint8_t* mac1
, const uint8_t* mac2
, const uint8_t* mask
)
12 for (int i
= 0; i
< 6; i
++)
17 if ((mac1
[i
] & m
) != (mac2
[i
] & m
))
23 uint32_t unaligned_u32(uint8_t* buf
)
25 return buf
[0] | (buf
[1] << 8) | (buf
[2] << 16) | (buf
[3] << 24);
28 uint16_t unaligned_u16(uint8_t* buf
)
30 return buf
[0] | (buf
[1] << 8);
33 int format_ip(uint32_t ip
, uint8_t* buf
)
35 uint8_t *p
= (uint8_t*) &ip
;
36 return snprintf((char*) buf
, IP_STR_LEN
, "%d.%d.%d.%d", p
[3], p
[2], p
[1], p
[0]);
39 int format_mac(uint8_t mac
[6], uint8_t buf
[MAC_STR_LEN
])
41 if (compare_mac(mac
, broadcast
, broadcast
))
43 memcpy(buf
, "[Broadcast ]", MAC_STR_LEN
);
44 return MAC_STR_LEN
- 1;
48 for (i
= 0; i
< 12; i
++)
50 buf
[i
+ (i
>> 1)] = hexalpha
[(mac
[i
>> 1] >> ((i
& 1)?0:4)) & 0x0F];
52 buf
[(i
* 3) + 2] = ':';
54 buf
[MAC_STR_LEN
- 1] = 0;
55 return MAC_STR_LEN
- 1;
58 int checksum16(uint8_t* buf
, int count
, int start
)
60 /* Compute Internet Checksum for "count" bytes
61 * beginning at location "addr".
63 register uint32_t sum
= start
;
66 /* This is the inner loop */
67 sum
+= unaligned_u16(buf
);
72 /* Add left-over byte, if any */
74 sum
+= * (uint8_t *) buf
;
76 /* Fold 32-bit sum to 16 bits */
77 while (sum
& 0xFFFF0000)
78 sum
= (sum
& 0xFFFF) + (sum
>> 16);
80 return (~sum
) & 0xFFFF;
83 uint32_t crc32(uint8_t* buf
, int length
)
85 static const uint32_t crc32_table
[] =
87 0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,
88 0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,
89 0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,
90 0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000
96 for (n
= 0; n
< length
; n
++)
98 crc
= (crc
>> 4) ^ crc32_table
[(crc
^ (buf
[n
] >> 0)) & 0x0F]; /* lower nibble */
99 crc
= (crc
>> 4) ^ crc32_table
[(crc
^ (buf
[n
] >> 4)) & 0x0F]; /* upper nibble */