1 1.72 rin /* $NetBSD: keysock.c,v 1.72 2024/07/05 04:31:54 rin Exp $ */ 2 1.64 maxv /* $FreeBSD: keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ 3 1.1 jonathan /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ 4 1.1 jonathan 5 1.1 jonathan /* 6 1.1 jonathan * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 7 1.1 jonathan * All rights reserved. 8 1.1 jonathan * 9 1.1 jonathan * Redistribution and use in source and binary forms, with or without 10 1.1 jonathan * modification, are permitted provided that the following conditions 11 1.1 jonathan * are met: 12 1.1 jonathan * 1. Redistributions of source code must retain the above copyright 13 1.1 jonathan * notice, this list of conditions and the following disclaimer. 14 1.1 jonathan * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 jonathan * notice, this list of conditions and the following disclaimer in the 16 1.1 jonathan * documentation and/or other materials provided with the distribution. 17 1.1 jonathan * 3. Neither the name of the project nor the names of its contributors 18 1.1 jonathan * may be used to endorse or promote products derived from this software 19 1.1 jonathan * without specific prior written permission. 20 1.1 jonathan * 21 1.1 jonathan * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 22 1.1 jonathan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 1.1 jonathan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 1.1 jonathan * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 25 1.1 jonathan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 1.1 jonathan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 1.1 jonathan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 1.1 jonathan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 1.1 jonathan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 1.1 jonathan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 1.1 jonathan * SUCH DAMAGE. 32 1.1 jonathan */ 33 1.1 jonathan 34 1.1 jonathan #include <sys/cdefs.h> 35 1.72 rin __KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.72 2024/07/05 04:31:54 rin Exp $"); 36 1.1 jonathan 37 1.1 jonathan /* This code has derived from sys/net/rtsock.c on FreeBSD2.2.5 */ 38 1.1 jonathan 39 1.1 jonathan #include <sys/types.h> 40 1.1 jonathan #include <sys/param.h> 41 1.1 jonathan #include <sys/domain.h> 42 1.1 jonathan #include <sys/errno.h> 43 1.1 jonathan #include <sys/kernel.h> 44 1.23 rmind #include <sys/kmem.h> 45 1.1 jonathan #include <sys/mbuf.h> 46 1.1 jonathan #include <sys/protosw.h> 47 1.1 jonathan #include <sys/signalvar.h> 48 1.1 jonathan #include <sys/socket.h> 49 1.1 jonathan #include <sys/socketvar.h> 50 1.1 jonathan #include <sys/sysctl.h> 51 1.1 jonathan #include <sys/systm.h> 52 1.55 ozaki #include <sys/cpu.h> 53 1.57 ozaki #include <sys/syslog.h> 54 1.1 jonathan 55 1.1 jonathan #include <net/raw_cb.h> 56 1.1 jonathan #include <net/route.h> 57 1.1 jonathan 58 1.1 jonathan #include <net/pfkeyv2.h> 59 1.1 jonathan #include <netipsec/key.h> 60 1.1 jonathan #include <netipsec/keysock.h> 61 1.1 jonathan #include <netipsec/key_debug.h> 62 1.1 jonathan 63 1.15 thorpej #include <netipsec/ipsec_private.h> 64 1.1 jonathan 65 1.1 jonathan struct key_cb { 66 1.1 jonathan int key_count; 67 1.1 jonathan int any_count; 68 1.1 jonathan }; 69 1.1 jonathan static struct key_cb key_cb; 70 1.1 jonathan 71 1.11 christos static struct sockaddr key_dst = { 72 1.11 christos .sa_len = 2, 73 1.11 christos .sa_family = PF_KEY, 74 1.11 christos }; 75 1.11 christos static struct sockaddr key_src = { 76 1.11 christos .sa_len = 2, 77 1.11 christos .sa_family = PF_KEY, 78 1.11 christos }; 79 1.1 jonathan 80 1.49 riastrad static const struct protosw keysw[]; 81 1.5 jonathan 82 1.17 dsl static int key_sendup0(struct rawcb *, struct mbuf *, int, int); 83 1.1 jonathan 84 1.19 joerg int key_registered_sb_max = (2048 * MHLEN); /* XXX arbitrary */ 85 1.5 jonathan 86 1.59 ozaki static kmutex_t *key_so_mtx; 87 1.61 ozaki static struct rawcbhead key_rawcb; 88 1.59 ozaki 89 1.59 ozaki void 90 1.59 ozaki key_init_so(void) 91 1.59 ozaki { 92 1.59 ozaki 93 1.59 ozaki key_so_mtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE); 94 1.59 ozaki } 95 1.59 ozaki 96 1.61 ozaki static void 97 1.61 ozaki key_pr_init(void) 98 1.61 ozaki { 99 1.61 ozaki 100 1.61 ozaki LIST_INIT(&key_rawcb); 101 1.61 ozaki } 102 1.61 ozaki 103 1.1 jonathan /* 104 1.1 jonathan * key_output() 105 1.1 jonathan */ 106 1.49 riastrad static int 107 1.49 riastrad key_output(struct mbuf *m, struct socket *so) 108 1.1 jonathan { 109 1.1 jonathan struct sadb_msg *msg; 110 1.1 jonathan int len, error = 0; 111 1.1 jonathan int s; 112 1.1 jonathan 113 1.53 ozaki KASSERT(m != NULL); 114 1.1 jonathan 115 1.15 thorpej { 116 1.71 riastrad net_stat_ref_t ps = PFKEY_STAT_GETREF(); 117 1.71 riastrad _NET_STATINC_REF(ps, PFKEY_STAT_OUT_TOTAL); 118 1.71 riastrad _NET_STATADD_REF(ps, PFKEY_STAT_OUT_BYTES, m->m_pkthdr.len); 119 1.15 thorpej PFKEY_STAT_PUTREF(); 120 1.15 thorpej } 121 1.1 jonathan 122 1.1 jonathan len = m->m_pkthdr.len; 123 1.1 jonathan if (len < sizeof(struct sadb_msg)) { 124 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_OUT_TOOSHORT); 125 1.1 jonathan error = EINVAL; 126 1.1 jonathan goto end; 127 1.1 jonathan } 128 1.1 jonathan 129 1.1 jonathan if (m->m_len < sizeof(struct sadb_msg)) { 130 1.1 jonathan if ((m = m_pullup(m, sizeof(struct sadb_msg))) == 0) { 131 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_OUT_NOMEM); 132 1.1 jonathan error = ENOBUFS; 133 1.1 jonathan goto end; 134 1.1 jonathan } 135 1.1 jonathan } 136 1.1 jonathan 137 1.53 ozaki KASSERT((m->m_flags & M_PKTHDR) != 0); 138 1.1 jonathan 139 1.52 ozaki if (KEYDEBUG_ON(KEYDEBUG_KEY_DUMP)) 140 1.62 christos kdebug_mbuf(__func__, m); 141 1.1 jonathan 142 1.1 jonathan msg = mtod(m, struct sadb_msg *); 143 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_OUT_MSGTYPE + msg->sadb_msg_type); 144 1.1 jonathan if (len != PFKEY_UNUNIT64(msg->sadb_msg_len)) { 145 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_OUT_INVLEN); 146 1.1 jonathan error = EINVAL; 147 1.1 jonathan goto end; 148 1.1 jonathan } 149 1.1 jonathan 150 1.1 jonathan /*XXX giant lock*/ 151 1.1 jonathan s = splsoftnet(); 152 1.1 jonathan error = key_parse(m, so); 153 1.1 jonathan m = NULL; 154 1.1 jonathan splx(s); 155 1.1 jonathan end: 156 1.72 rin m_freem(m); 157 1.1 jonathan return error; 158 1.1 jonathan } 159 1.1 jonathan 160 1.1 jonathan /* 161 1.1 jonathan * send message to the socket. 162 1.1 jonathan */ 163 1.1 jonathan static int 164 1.11 christos key_sendup0( 165 1.11 christos struct rawcb *rp, 166 1.11 christos struct mbuf *m, 167 1.11 christos int promisc, 168 1.11 christos int sbprio 169 1.11 christos ) 170 1.1 jonathan { 171 1.1 jonathan int error; 172 1.5 jonathan int ok; 173 1.1 jonathan 174 1.1 jonathan if (promisc) { 175 1.1 jonathan struct sadb_msg *pmsg; 176 1.1 jonathan 177 1.1 jonathan M_PREPEND(m, sizeof(struct sadb_msg), M_DONTWAIT); 178 1.1 jonathan if (m && m->m_len < sizeof(struct sadb_msg)) 179 1.1 jonathan m = m_pullup(m, sizeof(struct sadb_msg)); 180 1.1 jonathan if (!m) { 181 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_NOMEM); 182 1.1 jonathan return ENOBUFS; 183 1.1 jonathan } 184 1.1 jonathan m->m_pkthdr.len += sizeof(*pmsg); 185 1.1 jonathan 186 1.1 jonathan pmsg = mtod(m, struct sadb_msg *); 187 1.18 cegger memset(pmsg, 0, sizeof(*pmsg)); 188 1.1 jonathan pmsg->sadb_msg_version = PF_KEY_V2; 189 1.1 jonathan pmsg->sadb_msg_type = SADB_X_PROMISC; 190 1.1 jonathan pmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len); 191 1.1 jonathan /* pid and seq? */ 192 1.1 jonathan 193 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_MSGTYPE + pmsg->sadb_msg_type); 194 1.1 jonathan } 195 1.1 jonathan 196 1.5 jonathan if (sbprio == 0) 197 1.5 jonathan ok = sbappendaddr(&rp->rcb_socket->so_rcv, 198 1.5 jonathan (struct sockaddr *)&key_src, m, NULL); 199 1.5 jonathan else 200 1.5 jonathan ok = sbappendaddrchain(&rp->rcb_socket->so_rcv, 201 1.5 jonathan (struct sockaddr *)&key_src, m, sbprio); 202 1.5 jonathan 203 1.56 ozaki if (!ok) { 204 1.57 ozaki log(LOG_WARNING, 205 1.57 ozaki "%s: couldn't send PF_KEY message to the socket\n", 206 1.57 ozaki __func__); 207 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_NOMEM); 208 1.1 jonathan m_freem(m); 209 1.66 roy /* Don't call soroverflow because we're returning this 210 1.66 roy * error directly to the sender. */ 211 1.66 roy rp->rcb_socket->so_rcv.sb_overflowed++; 212 1.1 jonathan error = ENOBUFS; 213 1.63 roy } else { 214 1.63 roy sorwakeup(rp->rcb_socket); 215 1.1 jonathan error = 0; 216 1.63 roy } 217 1.1 jonathan return error; 218 1.1 jonathan } 219 1.1 jonathan 220 1.1 jonathan /* so can be NULL if target != KEY_SENDUP_ONE */ 221 1.60 ozaki static int 222 1.60 ozaki _key_sendup_mbuf(struct socket *so, struct mbuf *m, 223 1.14 degroote int target/*, sbprio */) 224 1.1 jonathan { 225 1.1 jonathan struct mbuf *n; 226 1.1 jonathan struct keycb *kp; 227 1.1 jonathan int sendup; 228 1.1 jonathan struct rawcb *rp; 229 1.1 jonathan int error = 0; 230 1.5 jonathan int sbprio = 0; /* XXX should be a parameter */ 231 1.1 jonathan 232 1.53 ozaki KASSERT(m != NULL); 233 1.54 ozaki KASSERT(so != NULL || target != KEY_SENDUP_ONE); 234 1.7 perry 235 1.5 jonathan /* 236 1.5 jonathan * RFC 2367 says ACQUIRE and other kernel-generated messages 237 1.5 jonathan * are special. We treat all KEY_SENDUP_REGISTERED messages 238 1.5 jonathan * as special, delivering them to all registered sockets 239 1.5 jonathan * even if the socket is at or above its so->so_rcv.sb_max limits. 240 1.5 jonathan * The only constraint is that the so_rcv data fall below 241 1.5 jonathan * key_registered_sb_max. 242 1.5 jonathan * Doing that check here avoids reworking every key_sendup_mbuf() 243 1.5 jonathan * in the short term. . The rework will be done after a technical 244 1.5 jonathan * conensus that this approach is appropriate. 245 1.5 jonathan */ 246 1.5 jonathan if (target == KEY_SENDUP_REGISTERED) { 247 1.5 jonathan sbprio = SB_PRIO_BESTEFFORT; 248 1.5 jonathan } 249 1.1 jonathan 250 1.15 thorpej { 251 1.71 riastrad net_stat_ref_t ps = PFKEY_STAT_GETREF(); 252 1.71 riastrad _NET_STATINC_REF(ps, PFKEY_STAT_IN_TOTAL); 253 1.71 riastrad _NET_STATADD_REF(ps, PFKEY_STAT_IN_BYTES, m->m_pkthdr.len); 254 1.15 thorpej PFKEY_STAT_PUTREF(); 255 1.15 thorpej } 256 1.1 jonathan if (m->m_len < sizeof(struct sadb_msg)) { 257 1.1 jonathan #if 1 258 1.1 jonathan m = m_pullup(m, sizeof(struct sadb_msg)); 259 1.1 jonathan if (m == NULL) { 260 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_NOMEM); 261 1.1 jonathan return ENOBUFS; 262 1.1 jonathan } 263 1.1 jonathan #else 264 1.1 jonathan /* don't bother pulling it up just for stats */ 265 1.1 jonathan #endif 266 1.1 jonathan } 267 1.1 jonathan if (m->m_len >= sizeof(struct sadb_msg)) { 268 1.1 jonathan struct sadb_msg *msg; 269 1.1 jonathan msg = mtod(m, struct sadb_msg *); 270 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_MSGTYPE + msg->sadb_msg_type); 271 1.1 jonathan } 272 1.1 jonathan 273 1.61 ozaki LIST_FOREACH(rp, &key_rawcb, rcb_list) 274 1.1 jonathan { 275 1.5 jonathan struct socket * kso = rp->rcb_socket; 276 1.1 jonathan if (rp->rcb_proto.sp_family != PF_KEY) 277 1.1 jonathan continue; 278 1.1 jonathan if (rp->rcb_proto.sp_protocol 279 1.1 jonathan && rp->rcb_proto.sp_protocol != PF_KEY_V2) { 280 1.1 jonathan continue; 281 1.1 jonathan } 282 1.1 jonathan 283 1.1 jonathan kp = (struct keycb *)rp; 284 1.1 jonathan 285 1.1 jonathan /* 286 1.1 jonathan * If you are in promiscuous mode, and when you get broadcasted 287 1.1 jonathan * reply, you'll get two PF_KEY messages. 288 1.1 jonathan * (based on pf_key (at) inner.net message on 14 Oct 1998) 289 1.1 jonathan */ 290 1.1 jonathan if (((struct keycb *)rp)->kp_promisc) { 291 1.65 maxv if ((n = m_copym(m, 0, (int)M_COPYALL, M_DONTWAIT)) != NULL) { 292 1.5 jonathan (void)key_sendup0(rp, n, 1, 0); 293 1.1 jonathan n = NULL; 294 1.1 jonathan } 295 1.1 jonathan } 296 1.1 jonathan 297 1.1 jonathan /* the exact target will be processed later */ 298 1.1 jonathan if (so && sotorawcb(so) == rp) 299 1.1 jonathan continue; 300 1.1 jonathan 301 1.1 jonathan sendup = 0; 302 1.1 jonathan switch (target) { 303 1.1 jonathan case KEY_SENDUP_ONE: 304 1.1 jonathan /* the statement has no effect */ 305 1.1 jonathan if (so && sotorawcb(so) == rp) 306 1.1 jonathan sendup++; 307 1.1 jonathan break; 308 1.1 jonathan case KEY_SENDUP_ALL: 309 1.1 jonathan sendup++; 310 1.1 jonathan break; 311 1.1 jonathan case KEY_SENDUP_REGISTERED: 312 1.5 jonathan if (kp->kp_registered) { 313 1.5 jonathan if (kso->so_rcv.sb_cc <= key_registered_sb_max) 314 1.5 jonathan sendup++; 315 1.5 jonathan else 316 1.5 jonathan printf("keysock: " 317 1.5 jonathan "registered sendup dropped, " 318 1.5 jonathan "sb_cc %ld max %d\n", 319 1.5 jonathan kso->so_rcv.sb_cc, 320 1.5 jonathan key_registered_sb_max); 321 1.5 jonathan } 322 1.1 jonathan break; 323 1.1 jonathan } 324 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_MSGTARGET + target); 325 1.1 jonathan 326 1.1 jonathan if (!sendup) 327 1.1 jonathan continue; 328 1.1 jonathan 329 1.65 maxv if ((n = m_copym(m, 0, (int)M_COPYALL, M_DONTWAIT)) == NULL) { 330 1.1 jonathan m_freem(m); 331 1.15 thorpej PFKEY_STATINC(PFKEY_STAT_IN_NOMEM); 332 1.1 jonathan return ENOBUFS; 333 1.1 jonathan } 334 1.1 jonathan 335 1.5 jonathan if ((error = key_sendup0(rp, n, 0, 0)) != 0) { 336 1.1 jonathan m_freem(m); 337 1.1 jonathan return error; 338 1.1 jonathan } 339 1.1 jonathan 340 1.1 jonathan n = NULL; 341 1.1 jonathan } 342 1.1 jonathan 343 1.5 jonathan /* The 'later' time for processing the exact target has arrived */ 344 1.1 jonathan if (so) { 345 1.5 jonathan error = key_sendup0(sotorawcb(so), m, 0, sbprio); 346 1.1 jonathan m = NULL; 347 1.1 jonathan } else { 348 1.1 jonathan error = 0; 349 1.1 jonathan m_freem(m); 350 1.1 jonathan } 351 1.1 jonathan return error; 352 1.1 jonathan } 353 1.1 jonathan 354 1.60 ozaki int 355 1.60 ozaki key_sendup_mbuf(struct socket *so, struct mbuf *m, 356 1.60 ozaki int target/*, sbprio */) 357 1.60 ozaki { 358 1.60 ozaki int error; 359 1.60 ozaki 360 1.60 ozaki if (so == NULL) 361 1.60 ozaki mutex_enter(key_so_mtx); 362 1.60 ozaki else 363 1.60 ozaki KASSERT(solocked(so)); 364 1.60 ozaki 365 1.60 ozaki error = _key_sendup_mbuf(so, m, target); 366 1.60 ozaki 367 1.60 ozaki if (so == NULL) 368 1.60 ozaki mutex_exit(key_so_mtx); 369 1.60 ozaki return error; 370 1.60 ozaki } 371 1.60 ozaki 372 1.23 rmind static int 373 1.23 rmind key_attach(struct socket *so, int proto) 374 1.23 rmind { 375 1.23 rmind struct keycb *kp; 376 1.23 rmind int s, error; 377 1.23 rmind 378 1.23 rmind KASSERT(sotorawcb(so) == NULL); 379 1.23 rmind kp = kmem_zalloc(sizeof(*kp), KM_SLEEP); 380 1.25 rmind kp->kp_raw.rcb_len = sizeof(*kp); 381 1.23 rmind so->so_pcb = kp; 382 1.23 rmind 383 1.23 rmind s = splsoftnet(); 384 1.59 ozaki 385 1.69 maxv if (so->so_lock != key_so_mtx) { 386 1.69 maxv KASSERT(so->so_lock == NULL); 387 1.69 maxv mutex_obj_hold(key_so_mtx); 388 1.69 maxv so->so_lock = key_so_mtx; 389 1.69 maxv solock(so); 390 1.69 maxv } 391 1.59 ozaki 392 1.61 ozaki error = raw_attach(so, proto, &key_rawcb); 393 1.23 rmind if (error) { 394 1.23 rmind PFKEY_STATINC(PFKEY_STAT_SOCKERR); 395 1.23 rmind kmem_free(kp, sizeof(*kp)); 396 1.23 rmind so->so_pcb = NULL; 397 1.23 rmind goto out; 398 1.23 rmind } 399 1.23 rmind 400 1.23 rmind kp->kp_promisc = kp->kp_registered = 0; 401 1.23 rmind 402 1.23 rmind if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */ 403 1.23 rmind key_cb.key_count++; 404 1.23 rmind key_cb.any_count++; 405 1.23 rmind kp->kp_raw.rcb_laddr = &key_src; 406 1.23 rmind kp->kp_raw.rcb_faddr = &key_dst; 407 1.23 rmind soisconnected(so); 408 1.23 rmind so->so_options |= SO_USELOOPBACK; 409 1.23 rmind out: 410 1.23 rmind KASSERT(solocked(so)); 411 1.23 rmind splx(s); 412 1.23 rmind return error; 413 1.23 rmind } 414 1.23 rmind 415 1.23 rmind static void 416 1.23 rmind key_detach(struct socket *so) 417 1.23 rmind { 418 1.23 rmind struct keycb *kp = (struct keycb *)sotorawcb(so); 419 1.23 rmind int s; 420 1.23 rmind 421 1.55 ozaki KASSERT(!cpu_softintr_p()); 422 1.23 rmind KASSERT(solocked(so)); 423 1.23 rmind KASSERT(kp != NULL); 424 1.23 rmind 425 1.23 rmind s = splsoftnet(); 426 1.23 rmind if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */ 427 1.23 rmind key_cb.key_count--; 428 1.23 rmind key_cb.any_count--; 429 1.23 rmind key_freereg(so); 430 1.23 rmind raw_detach(so); 431 1.23 rmind splx(s); 432 1.23 rmind } 433 1.23 rmind 434 1.28 rtr static int 435 1.46 rtr key_accept(struct socket *so, struct sockaddr *nam) 436 1.35 rtr { 437 1.35 rtr KASSERT(solocked(so)); 438 1.35 rtr 439 1.70 christos panic("%s: unsupported", __func__); 440 1.39 rtr 441 1.35 rtr return EOPNOTSUPP; 442 1.35 rtr } 443 1.35 rtr 444 1.35 rtr static int 445 1.45 rtr key_bind(struct socket *so, struct sockaddr *nam, struct lwp *l) 446 1.37 rtr { 447 1.37 rtr KASSERT(solocked(so)); 448 1.37 rtr 449 1.37 rtr return EOPNOTSUPP; 450 1.37 rtr } 451 1.37 rtr 452 1.37 rtr static int 453 1.40 rtr key_listen(struct socket *so, struct lwp *l) 454 1.37 rtr { 455 1.37 rtr KASSERT(solocked(so)); 456 1.37 rtr 457 1.37 rtr return EOPNOTSUPP; 458 1.37 rtr } 459 1.37 rtr 460 1.37 rtr static int 461 1.48 rtr key_connect(struct socket *so, struct sockaddr *nam, struct lwp *l) 462 1.38 rtr { 463 1.38 rtr KASSERT(solocked(so)); 464 1.38 rtr 465 1.38 rtr return EOPNOTSUPP; 466 1.38 rtr } 467 1.38 rtr 468 1.38 rtr static int 469 1.43 rtr key_connect2(struct socket *so, struct socket *so2) 470 1.43 rtr { 471 1.43 rtr KASSERT(solocked(so)); 472 1.43 rtr 473 1.43 rtr return EOPNOTSUPP; 474 1.43 rtr } 475 1.43 rtr 476 1.43 rtr static int 477 1.39 rtr key_disconnect(struct socket *so) 478 1.39 rtr { 479 1.39 rtr struct rawcb *rp = sotorawcb(so); 480 1.39 rtr int s; 481 1.39 rtr 482 1.39 rtr KASSERT(solocked(so)); 483 1.39 rtr KASSERT(rp != NULL); 484 1.39 rtr 485 1.39 rtr s = splsoftnet(); 486 1.39 rtr soisdisconnected(so); 487 1.39 rtr raw_disconnect(rp); 488 1.39 rtr splx(s); 489 1.39 rtr 490 1.39 rtr return 0; 491 1.39 rtr } 492 1.39 rtr 493 1.39 rtr static int 494 1.39 rtr key_shutdown(struct socket *so) 495 1.39 rtr { 496 1.39 rtr int s; 497 1.39 rtr 498 1.39 rtr KASSERT(solocked(so)); 499 1.39 rtr 500 1.39 rtr /* 501 1.39 rtr * Mark the connection as being incapable of further input. 502 1.39 rtr */ 503 1.39 rtr s = splsoftnet(); 504 1.39 rtr socantsendmore(so); 505 1.39 rtr splx(s); 506 1.39 rtr 507 1.39 rtr return 0; 508 1.39 rtr } 509 1.39 rtr 510 1.39 rtr static int 511 1.39 rtr key_abort(struct socket *so) 512 1.39 rtr { 513 1.39 rtr KASSERT(solocked(so)); 514 1.39 rtr 515 1.70 christos panic("%s: unsupported", __func__); 516 1.39 rtr 517 1.39 rtr return EOPNOTSUPP; 518 1.39 rtr } 519 1.39 rtr 520 1.39 rtr static int 521 1.29 rtr key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) 522 1.28 rtr { 523 1.28 rtr return EOPNOTSUPP; 524 1.28 rtr } 525 1.28 rtr 526 1.30 rtr static int 527 1.30 rtr key_stat(struct socket *so, struct stat *ub) 528 1.30 rtr { 529 1.33 rtr KASSERT(solocked(so)); 530 1.33 rtr 531 1.32 rtr return 0; 532 1.30 rtr } 533 1.30 rtr 534 1.34 rtr static int 535 1.46 rtr key_peeraddr(struct socket *so, struct sockaddr *nam) 536 1.34 rtr { 537 1.34 rtr struct rawcb *rp = sotorawcb(so); 538 1.34 rtr 539 1.34 rtr KASSERT(solocked(so)); 540 1.34 rtr KASSERT(rp != NULL); 541 1.34 rtr KASSERT(nam != NULL); 542 1.34 rtr 543 1.34 rtr if (rp->rcb_faddr == NULL) 544 1.34 rtr return ENOTCONN; 545 1.34 rtr 546 1.34 rtr raw_setpeeraddr(rp, nam); 547 1.34 rtr return 0; 548 1.34 rtr } 549 1.34 rtr 550 1.34 rtr static int 551 1.46 rtr key_sockaddr(struct socket *so, struct sockaddr *nam) 552 1.34 rtr { 553 1.34 rtr struct rawcb *rp = sotorawcb(so); 554 1.34 rtr 555 1.34 rtr KASSERT(solocked(so)); 556 1.34 rtr KASSERT(rp != NULL); 557 1.34 rtr KASSERT(nam != NULL); 558 1.34 rtr 559 1.34 rtr if (rp->rcb_faddr == NULL) 560 1.34 rtr return ENOTCONN; 561 1.34 rtr 562 1.34 rtr raw_setsockaddr(rp, nam); 563 1.34 rtr return 0; 564 1.34 rtr } 565 1.34 rtr 566 1.36 rtr static int 567 1.42 rtr key_rcvd(struct socket *so, int flags, struct lwp *l) 568 1.42 rtr { 569 1.42 rtr KASSERT(solocked(so)); 570 1.42 rtr 571 1.42 rtr return EOPNOTSUPP; 572 1.42 rtr } 573 1.42 rtr 574 1.42 rtr static int 575 1.36 rtr key_recvoob(struct socket *so, struct mbuf *m, int flags) 576 1.36 rtr { 577 1.36 rtr KASSERT(solocked(so)); 578 1.36 rtr 579 1.36 rtr return EOPNOTSUPP; 580 1.36 rtr } 581 1.36 rtr 582 1.36 rtr static int 583 1.48 rtr key_send(struct socket *so, struct mbuf *m, struct sockaddr *nam, 584 1.41 rtr struct mbuf *control, struct lwp *l) 585 1.41 rtr { 586 1.41 rtr int error = 0; 587 1.41 rtr int s; 588 1.41 rtr 589 1.41 rtr KASSERT(solocked(so)); 590 1.49 riastrad KASSERT(so->so_proto == &keysw[0]); 591 1.41 rtr 592 1.41 rtr s = splsoftnet(); 593 1.49 riastrad error = raw_send(so, m, nam, control, l, &key_output); 594 1.41 rtr splx(s); 595 1.41 rtr 596 1.41 rtr return error; 597 1.41 rtr } 598 1.41 rtr 599 1.41 rtr static int 600 1.36 rtr key_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) 601 1.36 rtr { 602 1.36 rtr KASSERT(solocked(so)); 603 1.36 rtr 604 1.36 rtr m_freem(m); 605 1.36 rtr m_freem(control); 606 1.36 rtr 607 1.36 rtr return EOPNOTSUPP; 608 1.36 rtr } 609 1.36 rtr 610 1.43 rtr static int 611 1.43 rtr key_purgeif(struct socket *so, struct ifnet *ifa) 612 1.43 rtr { 613 1.43 rtr 614 1.70 christos panic("%s: unsupported", __func__); 615 1.43 rtr 616 1.43 rtr return EOPNOTSUPP; 617 1.43 rtr } 618 1.43 rtr 619 1.1 jonathan /* 620 1.1 jonathan * Definitions of protocols supported in the KEY domain. 621 1.1 jonathan */ 622 1.1 jonathan 623 1.6 matt DOMAIN_DEFINE(keydomain); 624 1.1 jonathan 625 1.24 rmind PR_WRAP_USRREQS(key) 626 1.24 rmind #define key_attach key_attach_wrapper 627 1.24 rmind #define key_detach key_detach_wrapper 628 1.35 rtr #define key_accept key_accept_wrapper 629 1.37 rtr #define key_bind key_bind_wrapper 630 1.37 rtr #define key_listen key_listen_wrapper 631 1.38 rtr #define key_connect key_connect_wrapper 632 1.43 rtr #define key_connect2 key_connect2_wrapper 633 1.39 rtr #define key_disconnect key_disconnect_wrapper 634 1.39 rtr #define key_shutdown key_shutdown_wrapper 635 1.39 rtr #define key_abort key_abort_wrapper 636 1.28 rtr #define key_ioctl key_ioctl_wrapper 637 1.30 rtr #define key_stat key_stat_wrapper 638 1.34 rtr #define key_peeraddr key_peeraddr_wrapper 639 1.34 rtr #define key_sockaddr key_sockaddr_wrapper 640 1.42 rtr #define key_rcvd key_rcvd_wrapper 641 1.36 rtr #define key_recvoob key_recvoob_wrapper 642 1.41 rtr #define key_send key_send_wrapper 643 1.36 rtr #define key_sendoob key_sendoob_wrapper 644 1.43 rtr #define key_purgeif key_purgeif_wrapper 645 1.22 rmind 646 1.49 riastrad static const struct pr_usrreqs key_usrreqs = { 647 1.23 rmind .pr_attach = key_attach, 648 1.23 rmind .pr_detach = key_detach, 649 1.35 rtr .pr_accept = key_accept, 650 1.37 rtr .pr_bind = key_bind, 651 1.37 rtr .pr_listen = key_listen, 652 1.38 rtr .pr_connect = key_connect, 653 1.43 rtr .pr_connect2 = key_connect2, 654 1.39 rtr .pr_disconnect = key_disconnect, 655 1.39 rtr .pr_shutdown = key_shutdown, 656 1.39 rtr .pr_abort = key_abort, 657 1.28 rtr .pr_ioctl = key_ioctl, 658 1.30 rtr .pr_stat = key_stat, 659 1.34 rtr .pr_peeraddr = key_peeraddr, 660 1.34 rtr .pr_sockaddr = key_sockaddr, 661 1.42 rtr .pr_rcvd = key_rcvd, 662 1.36 rtr .pr_recvoob = key_recvoob, 663 1.41 rtr .pr_send = key_send, 664 1.36 rtr .pr_sendoob = key_sendoob, 665 1.43 rtr .pr_purgeif = key_purgeif, 666 1.22 rmind }; 667 1.22 rmind 668 1.49 riastrad static const struct protosw keysw[] = { 669 1.10 matt { 670 1.10 matt .pr_type = SOCK_RAW, 671 1.10 matt .pr_domain = &keydomain, 672 1.10 matt .pr_protocol = PF_KEY_V2, 673 1.10 matt .pr_flags = PR_ATOMIC|PR_ADDR, 674 1.10 matt .pr_ctlinput = raw_ctlinput, 675 1.22 rmind .pr_usrreqs = &key_usrreqs, 676 1.61 ozaki .pr_init = key_pr_init, 677 1.10 matt } 678 1.1 jonathan }; 679 1.1 jonathan 680 1.10 matt struct domain keydomain = { 681 1.10 matt .dom_family = PF_KEY, 682 1.10 matt .dom_name = "key", 683 1.10 matt .dom_init = key_init, 684 1.10 matt .dom_protosw = keysw, 685 1.10 matt .dom_protoswNPROTOSW = &keysw[__arraycount(keysw)], 686 1.10 matt }; 687