… | |
… | |
197 | } |
197 | } |
198 | |
198 | |
199 | static void |
199 | static void |
200 | pkt_cksum (PKT *pkt) |
200 | pkt_cksum (PKT *pkt) |
201 | { |
201 | { |
202 | uint_fast32_t sum = -pkt->cksum; |
202 | uint_fast32_t sum = 0; |
203 | uint32_t *wp = (uint32_t *)pkt; |
203 | uint32_t *wp = (uint32_t *)pkt; |
204 | int len = sizeof (*pkt) / 4; |
204 | int len = sizeof (*pkt) / 4; |
205 | |
205 | |
206 | do |
206 | do |
207 | { |
207 | { |
208 | uint_fast32_t w = *(volatile uint32_t *)wp++; |
208 | uint_fast32_t w = *(volatile uint32_t *)wp++; |
209 | sum += (w & 0xffff) + (w >> 16); |
209 | sum += (w & 0xffff) + (w >> 16); |
210 | } |
210 | } |
211 | while (len--); |
211 | while (--len); |
212 | |
212 | |
213 | sum = (sum >> 16) + (sum & 0xffff); /* add high 16 to low 16 */ |
213 | sum = (sum >> 16) + (sum & 0xffff); /* add high 16 to low 16 */ |
214 | sum += sum >> 16; /* add carry */ |
214 | sum += sum >> 16; /* add carry */ |
215 | |
215 | |
216 | pkt->cksum = ~sum; |
216 | pkt->cksum = ~sum; |
… | |
… | |
268 | |
268 | |
269 | if (addrlen == 4) |
269 | if (addrlen == 4) |
270 | { |
270 | { |
271 | struct sockaddr_in sa; |
271 | struct sockaddr_in sa; |
272 | |
272 | |
273 | pkt->type = ICMP4_ECHO; |
273 | pkt->type = ICMP4_ECHO; |
274 | pkt_cksum (pkt); |
274 | pkt_cksum (pkt); |
275 | |
275 | |
276 | sa.sin_family = AF_INET; |
276 | sa.sin_family = AF_INET; |
277 | sa.sin_port = 0; |
277 | sa.sin_port = 0; |
278 | |
278 | |