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

Function key_add

freebsd/netipsec/key.c:5522–5662  ·  view source on GitHub ↗

* SADB_ADD processing * add an entry to SA database, when received * * from the ikmpd, * and send * * to the ikmpd. * * IGNORE identity and sensitivity messages. * * m will

Source from the content-addressed store, hash-verified

5520 * m will always be freed.
5521 */
5522static int
5523key_add(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
5524{
5525 struct secasindex saidx;
5526 struct sadb_address *src0, *dst0;
5527 struct sadb_sa *sa0;
5528 struct secasvar *sav;
5529 uint32_t reqid, spi;
5530 uint8_t mode, proto;
5531 int error;
5532
5533 IPSEC_ASSERT(so != NULL, ("null socket"));
5534 IPSEC_ASSERT(m != NULL, ("null mbuf"));
5535 IPSEC_ASSERT(mhp != NULL, ("null msghdr"));
5536 IPSEC_ASSERT(mhp->msg != NULL, ("null msg"));
5537
5538 /* map satype to proto */
5539 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
5540 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n",
5541 __func__));
5542 return key_senderror(so, m, EINVAL);
5543 }
5544
5545 if (SADB_CHECKHDR(mhp, SADB_EXT_SA) ||
5546 SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) ||
5547 SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) ||
5548 (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP && (
5549 SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT) ||
5550 SADB_CHECKLEN(mhp, SADB_EXT_KEY_ENCRYPT))) ||
5551 (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH && (
5552 SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH) ||
5553 SADB_CHECKLEN(mhp, SADB_EXT_KEY_AUTH))) ||
5554 (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) &&
5555 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) ||
5556 (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) &&
5557 !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) {
5558 ipseclog((LOG_DEBUG,
5559 "%s: invalid message: missing required header.\n",
5560 __func__));
5561 return key_senderror(so, m, EINVAL);
5562 }
5563 if (SADB_CHECKLEN(mhp, SADB_EXT_SA) ||
5564 SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) ||
5565 SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) {
5566 ipseclog((LOG_DEBUG,
5567 "%s: invalid message: wrong header size.\n", __func__));
5568 return key_senderror(so, m, EINVAL);
5569 }
5570 if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) {
5571 mode = IPSEC_MODE_ANY;
5572 reqid = 0;
5573 } else {
5574 if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) {
5575 ipseclog((LOG_DEBUG,
5576 "%s: invalid message: wrong header size.\n",
5577 __func__));
5578 return key_senderror(so, m, EINVAL);
5579 }

Callers

nothing calls this directly

Calls 13

key_satype2protoFunction · 0.85
key_senderrorFunction · 0.85
key_checksockaddrsFunction · 0.85
key_getsav_tcpmd5Function · 0.85
key_getsavbyspiFunction · 0.85
key_freesavFunction · 0.85
key_newsavFunction · 0.85
kdebug_secasvFunction · 0.85
key_acqdoneFunction · 0.85
key_getmsgbuf_x1Function · 0.85
key_sendup_mbufFunction · 0.85
printfFunction · 0.50

Tested by

no test coverage detected