| 2290 | #endif /* INET6 */ |
| 2291 | |
| 2292 | static void |
| 2293 | pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa, |
| 2294 | struct pf_addr *na, u_int16_t np, u_int16_t *pc, u_int16_t *h2c, |
| 2295 | u_int16_t *ic, u_int16_t *hc, u_int8_t u, sa_family_t af) |
| 2296 | { |
| 2297 | struct pf_addr oia, ooa; |
| 2298 | |
| 2299 | PF_ACPY(&oia, ia, af); |
| 2300 | if (oa) |
| 2301 | PF_ACPY(&ooa, oa, af); |
| 2302 | |
| 2303 | /* Change inner protocol port, fix inner protocol checksum. */ |
| 2304 | if (ip != NULL) { |
| 2305 | u_int16_t oip = *ip; |
| 2306 | u_int32_t opc; |
| 2307 | |
| 2308 | if (pc != NULL) |
| 2309 | opc = *pc; |
| 2310 | *ip = np; |
| 2311 | if (pc != NULL) |
| 2312 | *pc = pf_cksum_fixup(*pc, oip, *ip, u); |
| 2313 | *ic = pf_cksum_fixup(*ic, oip, *ip, 0); |
| 2314 | if (pc != NULL) |
| 2315 | *ic = pf_cksum_fixup(*ic, opc, *pc, 0); |
| 2316 | } |
| 2317 | /* Change inner ip address, fix inner ip and icmp checksums. */ |
| 2318 | PF_ACPY(ia, na, af); |
| 2319 | switch (af) { |
| 2320 | #ifdef INET |
| 2321 | case AF_INET: { |
| 2322 | u_int32_t oh2c = *h2c; |
| 2323 | |
| 2324 | *h2c = pf_cksum_fixup(pf_cksum_fixup(*h2c, |
| 2325 | oia.addr16[0], ia->addr16[0], 0), |
| 2326 | oia.addr16[1], ia->addr16[1], 0); |
| 2327 | *ic = pf_cksum_fixup(pf_cksum_fixup(*ic, |
| 2328 | oia.addr16[0], ia->addr16[0], 0), |
| 2329 | oia.addr16[1], ia->addr16[1], 0); |
| 2330 | *ic = pf_cksum_fixup(*ic, oh2c, *h2c, 0); |
| 2331 | break; |
| 2332 | } |
| 2333 | #endif /* INET */ |
| 2334 | #ifdef INET6 |
| 2335 | case AF_INET6: |
| 2336 | *ic = pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup( |
| 2337 | pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup( |
| 2338 | pf_cksum_fixup(pf_cksum_fixup(*ic, |
| 2339 | oia.addr16[0], ia->addr16[0], u), |
| 2340 | oia.addr16[1], ia->addr16[1], u), |
| 2341 | oia.addr16[2], ia->addr16[2], u), |
| 2342 | oia.addr16[3], ia->addr16[3], u), |
| 2343 | oia.addr16[4], ia->addr16[4], u), |
| 2344 | oia.addr16[5], ia->addr16[5], u), |
| 2345 | oia.addr16[6], ia->addr16[6], u), |
| 2346 | oia.addr16[7], ia->addr16[7], u); |
| 2347 | break; |
| 2348 | #endif /* INET6 */ |
| 2349 | } |
no test coverage detected