* SADB_UPDATE processing * receive * * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL. * and send * * to the ikmpd. * * m will always be freed
| 5294 | * m will always be freed. |
| 5295 | */ |
| 5296 | static int |
| 5297 | key_update(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp) |
| 5298 | { |
| 5299 | struct secasindex saidx; |
| 5300 | struct sadb_address *src0, *dst0; |
| 5301 | struct sadb_sa *sa0; |
| 5302 | struct secasvar *sav; |
| 5303 | uint32_t reqid; |
| 5304 | int error; |
| 5305 | uint8_t mode, proto; |
| 5306 | |
| 5307 | IPSEC_ASSERT(so != NULL, ("null socket")); |
| 5308 | IPSEC_ASSERT(m != NULL, ("null mbuf")); |
| 5309 | IPSEC_ASSERT(mhp != NULL, ("null msghdr")); |
| 5310 | IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); |
| 5311 | |
| 5312 | /* map satype to proto */ |
| 5313 | if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { |
| 5314 | ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", |
| 5315 | __func__)); |
| 5316 | return key_senderror(so, m, EINVAL); |
| 5317 | } |
| 5318 | |
| 5319 | if (SADB_CHECKHDR(mhp, SADB_EXT_SA) || |
| 5320 | SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) || |
| 5321 | SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) || |
| 5322 | (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) && |
| 5323 | !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) || |
| 5324 | (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) && |
| 5325 | !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) { |
| 5326 | ipseclog((LOG_DEBUG, |
| 5327 | "%s: invalid message: missing required header.\n", |
| 5328 | __func__)); |
| 5329 | return key_senderror(so, m, EINVAL); |
| 5330 | } |
| 5331 | if (SADB_CHECKLEN(mhp, SADB_EXT_SA) || |
| 5332 | SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) || |
| 5333 | SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) { |
| 5334 | ipseclog((LOG_DEBUG, |
| 5335 | "%s: invalid message: wrong header size.\n", __func__)); |
| 5336 | return key_senderror(so, m, EINVAL); |
| 5337 | } |
| 5338 | if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) { |
| 5339 | mode = IPSEC_MODE_ANY; |
| 5340 | reqid = 0; |
| 5341 | } else { |
| 5342 | if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) { |
| 5343 | ipseclog((LOG_DEBUG, |
| 5344 | "%s: invalid message: wrong header size.\n", |
| 5345 | __func__)); |
| 5346 | return key_senderror(so, m, EINVAL); |
| 5347 | } |
| 5348 | mode = ((struct sadb_x_sa2 *) |
| 5349 | mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode; |
| 5350 | reqid = ((struct sadb_x_sa2 *) |
| 5351 | mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid; |
| 5352 | } |
| 5353 |
nothing calls this directly
no test coverage detected