ip.h (6017:7e310503019e) | ip.h (12392:e0dbdf30a2a5) |
---|---|
1/* 2 * ip.h 3 * 4 * Internet Protocol (RFC 791). 5 * 6 * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 7 * 8 * $Id: ip.h,v 1.23 2003/03/16 17:39:17 dugsong Exp $ --- 414 unchanged lines hidden (view full) --- 423size_t ip_add_option(void *buf, size_t len, 424 int proto, const void *optbuf, size_t optlen); 425void ip_checksum(void *buf, size_t len); 426 427inline int 428ip_cksum_add(const void *buf, size_t len, int cksum) 429{ 430 uint16_t *sp = (uint16_t *)buf; | 1/* 2 * ip.h 3 * 4 * Internet Protocol (RFC 791). 5 * 6 * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 7 * 8 * $Id: ip.h,v 1.23 2003/03/16 17:39:17 dugsong Exp $ --- 414 unchanged lines hidden (view full) --- 423size_t ip_add_option(void *buf, size_t len, 424 int proto, const void *optbuf, size_t optlen); 425void ip_checksum(void *buf, size_t len); 426 427inline int 428ip_cksum_add(const void *buf, size_t len, int cksum) 429{ 430 uint16_t *sp = (uint16_t *)buf; |
431 int n, sn; | 431 int sn; |
432 433 sn = len / 2; | 432 433 sn = len / 2; |
434 n = (sn + 15) / 16; | |
435 | 434 |
436 /* XXX - unroll loop using Duff's device. */ 437 switch (sn % 16) { 438 case 0: do { 439 cksum += *sp++; 440 case 15: 441 cksum += *sp++; 442 case 14: 443 cksum += *sp++; 444 case 13: 445 cksum += *sp++; 446 case 12: 447 cksum += *sp++; 448 case 11: 449 cksum += *sp++; 450 case 10: 451 cksum += *sp++; 452 case 9: 453 cksum += *sp++; 454 case 8: 455 cksum += *sp++; 456 case 7: 457 cksum += *sp++; 458 case 6: 459 cksum += *sp++; 460 case 5: 461 cksum += *sp++; 462 case 4: 463 cksum += *sp++; 464 case 3: 465 cksum += *sp++; 466 case 2: 467 cksum += *sp++; 468 case 1: 469 cksum += *sp++; 470 } while (--n > 0); 471 } | 435 do { 436 cksum += *sp++; 437 } while (--sn > 0); |
472 if (len & 1) 473 cksum += htons(*(u_char *)sp << 8); 474 475 return (cksum); 476} 477 478inline uint16_t 479ip_cksum_carry(int x) 480{ 481 x = (x >> 16) + (x & 0xffff); 482 return ~(x + (x >> 16)) & 0xffff; 483} 484 485__END_DECLS 486 487#endif /* DNET_IP_H */ | 438 if (len & 1) 439 cksum += htons(*(u_char *)sp << 8); 440 441 return (cksum); 442} 443 444inline uint16_t 445ip_cksum_carry(int x) 446{ 447 x = (x >> 16) + (x & 0xffff); 448 return ~(x + (x >> 16)) & 0xffff; 449} 450 451__END_DECLS 452 453#endif /* DNET_IP_H */ |