| 103 | } |
| 104 | |
| 105 | u_short |
| 106 | in_cksum_skip(struct mbuf *m, int len, int skip) |
| 107 | { |
| 108 | u_int64_t sum = 0; |
| 109 | int mlen = 0; |
| 110 | int clen = 0; |
| 111 | caddr_t addr; |
| 112 | union q_util q_util; |
| 113 | union l_util l_util; |
| 114 | |
| 115 | len -= skip; |
| 116 | for (; skip && m; m = m->m_next) { |
| 117 | if (m->m_len > skip) { |
| 118 | mlen = m->m_len - skip; |
| 119 | addr = mtod(m, caddr_t) + skip; |
| 120 | goto skip_start; |
| 121 | } else { |
| 122 | skip -= m->m_len; |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | for (; m && len; m = m->m_next) { |
| 127 | if (m->m_len == 0) |
| 128 | continue; |
| 129 | mlen = m->m_len; |
| 130 | addr = mtod(m, caddr_t); |
| 131 | skip_start: |
| 132 | if (len < mlen) |
| 133 | mlen = len; |
| 134 | |
| 135 | if ((clen ^ (int) addr) & 1) |
| 136 | sum += _do_cksum(addr, mlen) << 8; |
| 137 | else |
| 138 | sum += _do_cksum(addr, mlen); |
| 139 | |
| 140 | clen += mlen; |
| 141 | len -= mlen; |
| 142 | } |
| 143 | REDUCE16; |
| 144 | return (~sum & 0xffff); |
| 145 | } |
| 146 | |
| 147 | u_int in_cksum_hdr(const struct ip *ip) |
| 148 | { |
no test coverage detected