* subroutine for SADB_GET and SADB_DUMP. */
| 3532 | * subroutine for SADB_GET and SADB_DUMP. |
| 3533 | */ |
| 3534 | static struct mbuf * |
| 3535 | key_setdumpsa(struct secasvar *sav, uint8_t type, uint8_t satype, |
| 3536 | uint32_t seq, uint32_t pid) |
| 3537 | { |
| 3538 | struct seclifetime lft_c; |
| 3539 | struct mbuf *result = NULL, *tres = NULL, *m; |
| 3540 | int i, dumporder[] = { |
| 3541 | SADB_EXT_SA, SADB_X_EXT_SA2, SADB_X_EXT_SA_REPLAY, |
| 3542 | SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT, |
| 3543 | SADB_EXT_LIFETIME_CURRENT, SADB_EXT_ADDRESS_SRC, |
| 3544 | SADB_EXT_ADDRESS_DST, SADB_EXT_ADDRESS_PROXY, |
| 3545 | SADB_EXT_KEY_AUTH, SADB_EXT_KEY_ENCRYPT, |
| 3546 | SADB_EXT_IDENTITY_SRC, SADB_EXT_IDENTITY_DST, |
| 3547 | SADB_EXT_SENSITIVITY, |
| 3548 | SADB_X_EXT_NAT_T_TYPE, |
| 3549 | SADB_X_EXT_NAT_T_SPORT, SADB_X_EXT_NAT_T_DPORT, |
| 3550 | SADB_X_EXT_NAT_T_OAI, SADB_X_EXT_NAT_T_OAR, |
| 3551 | SADB_X_EXT_NAT_T_FRAG, |
| 3552 | }; |
| 3553 | uint32_t replay_count; |
| 3554 | |
| 3555 | m = key_setsadbmsg(type, 0, satype, seq, pid, sav->refcnt); |
| 3556 | if (m == NULL) |
| 3557 | goto fail; |
| 3558 | result = m; |
| 3559 | |
| 3560 | for (i = nitems(dumporder) - 1; i >= 0; i--) { |
| 3561 | m = NULL; |
| 3562 | switch (dumporder[i]) { |
| 3563 | case SADB_EXT_SA: |
| 3564 | m = key_setsadbsa(sav); |
| 3565 | if (!m) |
| 3566 | goto fail; |
| 3567 | break; |
| 3568 | |
| 3569 | case SADB_X_EXT_SA2: |
| 3570 | SECASVAR_LOCK(sav); |
| 3571 | replay_count = sav->replay ? sav->replay->count : 0; |
| 3572 | SECASVAR_UNLOCK(sav); |
| 3573 | m = key_setsadbxsa2(sav->sah->saidx.mode, replay_count, |
| 3574 | sav->sah->saidx.reqid); |
| 3575 | if (!m) |
| 3576 | goto fail; |
| 3577 | break; |
| 3578 | |
| 3579 | case SADB_X_EXT_SA_REPLAY: |
| 3580 | if (sav->replay == NULL || |
| 3581 | sav->replay->wsize <= UINT8_MAX) |
| 3582 | continue; |
| 3583 | |
| 3584 | m = key_setsadbxsareplay(sav->replay->wsize); |
| 3585 | if (!m) |
| 3586 | goto fail; |
| 3587 | break; |
| 3588 | |
| 3589 | case SADB_EXT_ADDRESS_SRC: |
| 3590 | m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, |
| 3591 | &sav->sah->saidx.src.sa, |
no test coverage detected