MCPcopy Create free account
hub / github.com/F-Stack/f-stack / key_update

Function key_update

freebsd/netipsec/key.c:5296–5505  ·  view source on GitHub ↗

* 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

Source from the content-addressed store, hash-verified

5294 * m will always be freed.
5295 */
5296static int
5297key_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

Callers

nothing calls this directly

Calls 14

key_satype2protoFunction · 0.85
key_senderrorFunction · 0.85
key_checksockaddrsFunction · 0.85
key_getsavbyspiFunction · 0.85
key_freesavFunction · 0.85
key_cmpsaidxFunction · 0.85
key_setsavalFunction · 0.85
key_updatelifetimesFunction · 0.85
key_updateaddressesFunction · 0.85
kdebug_secasvFunction · 0.85
key_getmsgbuf_x1Function · 0.85
key_sendup_mbufFunction · 0.85

Tested by

no test coverage detected