24 #include <freeradius-devel/libradius.h>
25 #include <freeradius-devel/net.h>
31 {
"UDP", IPPROTO_UDP },
32 {
"TCP", IPPROTO_TCP },
40 {
"UDP", SOCK_DGRAM },
41 {
"TCP", SOCK_STREAM },
97 uint8_t
const *p =
data;
106 if (((
size_t)(p - data)) > len) {
109 (
size_t)(p - data), len);
120 if (((
size_t)(p - data)) > len) {
124 for (i = 0; i < 3; i++) {
125 ether_type = ntohs(*((uint16_t
const *) p));
126 switch (ether_type) {
136 if (((
size_t)(p - data)) > len) {
143 if (((
size_t)(p - data)) > len) {
155 if (((
size_t)(p - data)) > len) {
162 if (((
size_t)(p - data)) > len) {
199 udp_len = ntohs(udp->len);
200 diff = udp_len - remaining;
203 fr_strerror_printf(
"packet too small by %zi bytes, UDP header + Payload should be %hu bytes",
209 fr_strerror_printf(
"Packet too big by %zi bytes, UDP header + Payload should be %hu bytes",
214 expected =
fr_udp_checksum((uint8_t
const *) udp, ntohs(udp->len), udp->checksum,
215 ip->ip_src, ip->ip_dst);
216 if (udp->checksum != expected) {
218 ntohs(udp->checksum), ntohs(expected));
241 struct in_addr
const src_addr,
struct in_addr
const dst_addr)
244 uint16_t
const *p = (uint16_t
const *)data;
246 uint16_t
const *ip_src = (
void const *) &src_addr.s_addr;
247 uint16_t
const *ip_dst = (
void const *) &dst_addr.s_addr;
255 sum += htons(IPPROTO_UDP);
258 for (i = len; i > 1; i -= 2) sum += *p++;
259 if (i) sum += (0xff & *(uint8_t
const *)p) << 8;
263 while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16);
265 return ((uint16_t) ~sum);
278 uint16_t
const *p = (uint16_t
const *)data;
280 uint8_t nwords = (ihl << 1);
282 for (sum = 0; nwords > 0; nwords--) {
285 sum = (sum >> 16) + (sum & 0xffff);
287 return ((uint16_t) ~sum);
uint16_t fr_ip_header_checksum(uint8_t const *data, uint8_t ihl)
Calculate IP header checksum.
bool fr_link_layer_supported(int link_layer)
Check whether fr_link_layer_offset can process a link_layer.
ssize_t fr_link_layer_offset(uint8_t const *data, size_t len, int link_layer)
Returns the length of the link layer header.
int fr_udp_header_check(uint8_t const *data, uint16_t remaining, ip_header_t const *ip)
Check UDP header is valid.
FR_NAME_NUMBER const fr_net_sock_type_table[]
Strings for socket types.
FR_NAME_NUMBER const fr_net_af_table[]
Strings for address families.
uint16_t fr_udp_checksum(uint8_t const *data, uint16_t len, uint16_t checksum, struct in_addr const src_addr, struct in_addr const dst_addr)
Calculate UDP checksum.
void fr_strerror_printf(char const *,...) CC_HINT(format(printf
FR_NAME_NUMBER const fr_net_ip_proto_table[]
Strings for L4 protocols.