24 #ifndef SURICATA_DECODE_UDP_H
25 #define SURICATA_DECODE_UDP_H
27 #define UDP_HEADER_LEN 8
30 #define UDP_GET_RAW_LEN(udph) SCNtohs((udph)->uh_len)
31 #define UDP_GET_RAW_SRC_PORT(udph) SCNtohs((udph)->uh_sport)
32 #define UDP_GET_RAW_DST_PORT(udph) SCNtohs((udph)->uh_dport)
33 #define UDP_GET_RAW_SUM(udph) SCNtohs((udph)->uh_sum)
35 #define UDP_GET_LEN(p) UDP_GET_RAW_LEN(p->udph)
36 #define UDP_GET_SRC_PORT(p) UDP_GET_RAW_SRC_PORT(p->udph)
37 #define UDP_GET_DST_PORT(p) UDP_GET_RAW_DST_PORT(p->udph)
38 #define UDP_GET_SUM(p) UDP_GET_RAW_SUM(p->udph)
66 static inline uint16_t UDPV4Checksum(
67 const uint16_t *shdr,
const uint16_t *pkt, uint16_t tlen, uint16_t init)
72 csum += shdr[0] + shdr[1] + shdr[2] + shdr[3] + htons(17) + htons(tlen);
74 csum += pkt[0] + pkt[1] + pkt[2];
80 csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
81 pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13] +
88 csum += pkt[0] + pkt[1] + pkt[2] + pkt[3];
94 csum += pkt[0] + pkt[1];
106 *(uint8_t *)(&
pad) = (*(uint8_t *)pkt);
110 csum = (csum >> 16) + (csum & 0x0000FFFF);
111 csum += (csum >> 16);
113 uint16_t csum_u16 = (uint16_t)~csum;
114 if (init == 0 && csum_u16 == 0)
133 static inline uint16_t UDPV6Checksum(
134 const uint16_t *shdr,
const uint16_t *pkt, uint16_t tlen, uint16_t init)
137 uint32_t csum = init;
139 csum += shdr[0] + shdr[1] + shdr[2] + shdr[3] + shdr[4] + shdr[5] + shdr[6] +
140 shdr[7] + shdr[8] + shdr[9] + shdr[10] + shdr[11] + shdr[12] +
141 shdr[13] + shdr[14] + shdr[15] + htons(17) + htons(tlen);
143 csum += pkt[0] + pkt[1] + pkt[2];
149 csum += pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4] + pkt[5] + pkt[6] +
150 pkt[7] + pkt[8] + pkt[9] + pkt[10] + pkt[11] + pkt[12] + pkt[13] +
157 csum += pkt[0] + pkt[1] + pkt[2] + pkt[3];
163 csum += pkt[0] + pkt[1];
175 *(uint8_t *)(&
pad) = (*(uint8_t *)pkt);
179 csum = (csum >> 16) + (csum & 0x0000FFFF);
180 csum += (csum >> 16);
182 uint16_t csum_u16 = (uint16_t)~csum;
183 if (init == 0 && csum_u16 == 0)