| 5292 | } |
| 5293 | |
| 5294 | static int |
| 5295 | pf_test_state_other(struct pf_state **state, int direction, struct pfi_kkif *kif, |
| 5296 | struct mbuf *m, struct pf_pdesc *pd) |
| 5297 | { |
| 5298 | struct pf_state_peer *src, *dst; |
| 5299 | struct pf_state_key_cmp key; |
| 5300 | |
| 5301 | bzero(&key, sizeof(key)); |
| 5302 | key.af = pd->af; |
| 5303 | key.proto = pd->proto; |
| 5304 | if (direction == PF_IN) { |
| 5305 | PF_ACPY(&key.addr[0], pd->src, key.af); |
| 5306 | PF_ACPY(&key.addr[1], pd->dst, key.af); |
| 5307 | key.port[0] = key.port[1] = 0; |
| 5308 | } else { |
| 5309 | PF_ACPY(&key.addr[1], pd->src, key.af); |
| 5310 | PF_ACPY(&key.addr[0], pd->dst, key.af); |
| 5311 | key.port[1] = key.port[0] = 0; |
| 5312 | } |
| 5313 | |
| 5314 | STATE_LOOKUP(kif, &key, direction, *state, pd); |
| 5315 | |
| 5316 | if (direction == (*state)->direction) { |
| 5317 | src = &(*state)->src; |
| 5318 | dst = &(*state)->dst; |
| 5319 | } else { |
| 5320 | src = &(*state)->dst; |
| 5321 | dst = &(*state)->src; |
| 5322 | } |
| 5323 | |
| 5324 | /* update states */ |
| 5325 | if (src->state < PFOTHERS_SINGLE) |
| 5326 | src->state = PFOTHERS_SINGLE; |
| 5327 | if (dst->state == PFOTHERS_SINGLE) |
| 5328 | dst->state = PFOTHERS_MULTIPLE; |
| 5329 | |
| 5330 | /* update expire time */ |
| 5331 | (*state)->expire = time_uptime; |
| 5332 | if (src->state == PFOTHERS_MULTIPLE && dst->state == PFOTHERS_MULTIPLE) |
| 5333 | (*state)->timeout = PFTM_OTHER_MULTIPLE; |
| 5334 | else |
| 5335 | (*state)->timeout = PFTM_OTHER_SINGLE; |
| 5336 | |
| 5337 | /* translate source/destination address, if necessary */ |
| 5338 | if ((*state)->key[PF_SK_WIRE] != (*state)->key[PF_SK_STACK]) { |
| 5339 | struct pf_state_key *nk = (*state)->key[pd->didx]; |
| 5340 | |
| 5341 | KASSERT(nk, ("%s: nk is null", __func__)); |
| 5342 | KASSERT(pd, ("%s: pd is null", __func__)); |
| 5343 | KASSERT(pd->src, ("%s: pd->src is null", __func__)); |
| 5344 | KASSERT(pd->dst, ("%s: pd->dst is null", __func__)); |
| 5345 | switch (pd->af) { |
| 5346 | #ifdef INET |
| 5347 | case AF_INET: |
| 5348 | if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], AF_INET)) |
| 5349 | pf_change_a(&pd->src->v4.s_addr, |
| 5350 | pd->ip_sum, |
| 5351 | nk->addr[pd->sidx].v4.s_addr, |
no test coverage detected