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 */