1 1.1 rjs /* $KAME: dccp6_usrreq.c,v 1.13 2005/07/27 08:42:56 nishida Exp $ */ 2 1.15 ozaki /* $NetBSD: dccp6_usrreq.c,v 1.15 2022/11/04 09:01:53 ozaki-r Exp $ */ 3 1.1 rjs 4 1.1 rjs /* 5 1.1 rjs * Copyright (C) 2003 WIDE Project. 6 1.1 rjs * All rights reserved. 7 1.1 rjs * 8 1.1 rjs * Redistribution and use in source and binary forms, with or without 9 1.1 rjs * modification, are permitted provided that the following conditions 10 1.1 rjs * are met: 11 1.1 rjs * 1. Redistributions of source code must retain the above copyright 12 1.1 rjs * notice, this list of conditions and the following disclaimer. 13 1.1 rjs * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 rjs * notice, this list of conditions and the following disclaimer in the 15 1.1 rjs * documentation and/or other materials provided with the distribution. 16 1.1 rjs * 3. Neither the name of the project nor the names of its contributors 17 1.1 rjs * may be used to endorse or promote products derived from this software 18 1.1 rjs * without specific prior written permission. 19 1.1 rjs * 20 1.1 rjs * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 21 1.1 rjs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 1.1 rjs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 1.1 rjs * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 24 1.1 rjs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 1.1 rjs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 1.1 rjs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 1.1 rjs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 1.1 rjs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 1.1 rjs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 1.1 rjs * SUCH DAMAGE. 31 1.1 rjs */ 32 1.1 rjs 33 1.1 rjs #include <sys/cdefs.h> 34 1.15 ozaki __KERNEL_RCSID(0, "$NetBSD: dccp6_usrreq.c,v 1.15 2022/11/04 09:01:53 ozaki-r Exp $"); 35 1.1 rjs 36 1.7 pooka #ifdef _KERNEL_OPT 37 1.1 rjs #include "opt_inet.h" 38 1.1 rjs #include "opt_dccp.h" 39 1.9 knakahar #include "opt_net_mpsafe.h" 40 1.7 pooka #endif 41 1.1 rjs 42 1.1 rjs #include <sys/param.h> 43 1.1 rjs #include <sys/systm.h> 44 1.1 rjs #include <sys/domain.h> 45 1.1 rjs #include <sys/kernel.h> 46 1.1 rjs #include <sys/pool.h> 47 1.1 rjs #include <sys/lock.h> 48 1.1 rjs #include <sys/malloc.h> 49 1.1 rjs #include <sys/mbuf.h> 50 1.1 rjs #include <sys/proc.h> 51 1.1 rjs #include <sys/protosw.h> 52 1.1 rjs #include <sys/signalvar.h> 53 1.1 rjs #include <sys/socket.h> 54 1.1 rjs #include <sys/socketvar.h> 55 1.1 rjs #include <sys/mutex.h> 56 1.1 rjs #include <sys/sysctl.h> 57 1.1 rjs #include <sys/syslog.h> 58 1.1 rjs #include <sys/queue.h> 59 1.1 rjs 60 1.1 rjs #include <net/if.h> 61 1.1 rjs 62 1.1 rjs #include <netinet/in.h> 63 1.1 rjs #include <netinet/in_systm.h> 64 1.1 rjs #include <netinet/ip.h> 65 1.1 rjs #include <netinet/in_pcb.h> 66 1.1 rjs #include <netinet/in_var.h> 67 1.1 rjs #include <netinet/ip6.h> 68 1.1 rjs #include <netinet/ip_icmp.h> 69 1.1 rjs #include <netinet/icmp_var.h> 70 1.1 rjs #include <netinet/ip_var.h> 71 1.1 rjs #include <netinet6/in6_pcb.h> 72 1.1 rjs #include <netinet6/ip6_var.h> 73 1.1 rjs #include <netinet/dccp.h> 74 1.1 rjs #include <netinet/dccp_var.h> 75 1.1 rjs #include <netinet6/dccp6_var.h> 76 1.1 rjs #include <netinet/dccp_cc_sw.h> 77 1.1 rjs 78 1.1 rjs #if !defined(__FreeBSD__) || __FreeBSD_version < 500000 79 1.1 rjs #define INP_INFO_LOCK_INIT(x,y) 80 1.1 rjs #define INP_INFO_WLOCK(x) 81 1.1 rjs #define INP_INFO_WUNLOCK(x) 82 1.1 rjs #define INP_INFO_RLOCK(x) 83 1.1 rjs #define INP_INFO_RUNLOCK(x) 84 1.1 rjs #define INP_LOCK(x) 85 1.1 rjs #define INP_UNLOCK(x) 86 1.1 rjs #endif 87 1.1 rjs 88 1.1 rjs #define PULLDOWN_TEST 89 1.1 rjs 90 1.1 rjs int 91 1.1 rjs dccp6_input(struct mbuf **mp, int *offp, int proto) 92 1.1 rjs { 93 1.1 rjs struct mbuf *m = *mp; 94 1.1 rjs DCCP_DEBUG((LOG_INFO, "In dccp6_input!\n")); 95 1.1 rjs #ifndef PULLDOWN_TEST 96 1.1 rjs IP6_EXTHDR_CHECK(m, *offp, sizeof(struct dccphdr), IPPROTO_DONE); 97 1.1 rjs #endif 98 1.1 rjs 99 1.12 rjs dccp_input(m, *offp, proto); 100 1.1 rjs return IPPROTO_DONE; 101 1.1 rjs } 102 1.1 rjs 103 1.1 rjs void * 104 1.1 rjs dccp6_ctlinput(int cmd, const struct sockaddr *sa, void *d) 105 1.1 rjs { 106 1.1 rjs if (sa->sa_family != AF_INET6 || 107 1.1 rjs sa->sa_len != sizeof(struct sockaddr_in6)) 108 1.1 rjs return NULL; 109 1.1 rjs 110 1.1 rjs /* FIX LATER */ 111 1.1 rjs return NULL; 112 1.1 rjs } 113 1.1 rjs 114 1.1 rjs int 115 1.2 rtr dccp6_bind(struct socket *so, struct sockaddr *nam, struct lwp *td) 116 1.1 rjs { 117 1.13 ozaki struct inpcb *inp; 118 1.1 rjs int error; 119 1.13 ozaki struct sockaddr_in6 *sinp = (struct sockaddr_in6 *)nam; 120 1.1 rjs 121 1.1 rjs DCCP_DEBUG((LOG_INFO, "Entering dccp6_bind!\n")); 122 1.1 rjs INP_INFO_WLOCK(&dccpbinfo); 123 1.13 ozaki inp = sotoinpcb(so); 124 1.13 ozaki if (inp == 0) { 125 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 126 1.13 ozaki DCCP_DEBUG((LOG_INFO, "dccp6_bind: inp == 0!\n")); 127 1.1 rjs return EINVAL; 128 1.1 rjs } 129 1.1 rjs /* Do not bind to multicast addresses! */ 130 1.13 ozaki if (sinp->sin6_family == AF_INET6 && 131 1.13 ozaki IN6_IS_ADDR_MULTICAST(&sinp->sin6_addr)) { 132 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 133 1.1 rjs return EAFNOSUPPORT; 134 1.1 rjs } 135 1.1 rjs INP_LOCK(inp); 136 1.1 rjs 137 1.13 ozaki intodccpcb(inp)->inp_vflag &= ~INP_IPV4; 138 1.13 ozaki intodccpcb(inp)->inp_vflag |= INP_IPV6; 139 1.1 rjs 140 1.15 ozaki error = in6pcb_bind(inp, sinp, td); 141 1.1 rjs INP_UNLOCK(inp); 142 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 143 1.1 rjs return error; 144 1.1 rjs } 145 1.1 rjs 146 1.1 rjs int 147 1.6 rtr dccp6_connect(struct socket *so, struct sockaddr *nam, struct lwp *l) 148 1.1 rjs { 149 1.13 ozaki struct inpcb *inp; 150 1.1 rjs struct dccpcb *dp; 151 1.1 rjs int error; 152 1.1 rjs struct sockaddr_in6 *sin6; 153 1.1 rjs char test[2]; 154 1.1 rjs 155 1.1 rjs DCCP_DEBUG((LOG_INFO, "Entering dccp6_connect!\n")); 156 1.1 rjs 157 1.1 rjs #ifndef __NetBSD__ 158 1.1 rjs INP_INFO_WLOCK(&dccpbinfo); 159 1.1 rjs inp = sotoinpcb(so); 160 1.1 rjs if (inp == 0) { 161 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 162 1.1 rjs return EINVAL; 163 1.1 rjs } 164 1.1 rjs INP_LOCK(inp); 165 1.14 ozaki if (in6p_faddr(inp).s_addr != INADDR_ANY) { 166 1.1 rjs INP_UNLOCK(inp); 167 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 168 1.1 rjs return EISCONN; 169 1.1 rjs } 170 1.1 rjs 171 1.1 rjs dp = (struct dccpcb *)inp->inp_ppcb; 172 1.1 rjs #else 173 1.13 ozaki inp = sotoinpcb(so); 174 1.13 ozaki if (inp == 0) { 175 1.1 rjs return EINVAL; 176 1.1 rjs } 177 1.14 ozaki if (!IN6_IS_ADDR_UNSPECIFIED(&in6p_faddr(inp))) { 178 1.1 rjs return EISCONN; 179 1.1 rjs } 180 1.1 rjs 181 1.13 ozaki dp = (struct dccpcb *)inp->inp_ppcb; 182 1.1 rjs #endif 183 1.1 rjs if (dp->state == DCCPS_ESTAB) { 184 1.1 rjs DCCP_DEBUG((LOG_INFO, "Why are we in connect when we already have a established connection?\n")); 185 1.1 rjs } 186 1.1 rjs 187 1.1 rjs dp->who = DCCP_CLIENT; 188 1.1 rjs dp->seq_snd = (((u_int64_t)random() << 32) | random()) % 281474976710656LL; 189 1.1 rjs 190 1.1 rjs sin6 = (struct sockaddr_in6 *)nam; 191 1.1 rjs if (sin6->sin6_family == AF_INET6 192 1.1 rjs && IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { 193 1.1 rjs error = EAFNOSUPPORT; 194 1.1 rjs goto bad; 195 1.1 rjs } 196 1.1 rjs 197 1.1 rjs dp->inp_vflag &= ~INP_IPV4; 198 1.1 rjs dp->inp_vflag |= INP_IPV6; 199 1.1 rjs 200 1.6 rtr error = dccp_doconnect(so, nam, l, 1); 201 1.1 rjs 202 1.1 rjs if (error != 0) 203 1.1 rjs goto bad; 204 1.1 rjs 205 1.1 rjs callout_reset(&dp->retrans_timer, dp->retrans, dccp_retrans_t, dp); 206 1.1 rjs callout_reset(&dp->connect_timer, DCCP_CONNECT_TIMER, dccp_connect_t, dp); 207 1.1 rjs 208 1.1 rjs test[0] = dp->pref_cc; 209 1.1 rjs #if 0 210 1.1 rjs /* FIX THIS LATER */ 211 1.1 rjs if (dp->pref_cc == 2) { 212 1.1 rjs test[1] = 3; 213 1.1 rjs } else { 214 1.1 rjs test[1] = 2; 215 1.1 rjs } 216 1.1 rjs dccp_add_feature(dp, DCCP_OPT_CHANGE, DCCP_FEATURE_CC, test, 2); 217 1.1 rjs dccp_add_feature(dp, DCCP_OPT_PREFER, DCCP_FEATURE_CC, test, 2); 218 1.1 rjs #else 219 1.1 rjs /* we only support CCID2 at this moment */ 220 1.1 rjs dccp_add_feature(dp, DCCP_OPT_CHANGE_R, DCCP_FEATURE_CC, test, 1); 221 1.1 rjs #endif 222 1.1 rjs 223 1.1 rjs error = dccp_output(dp, 0); 224 1.1 rjs 225 1.1 rjs bad: 226 1.1 rjs INP_UNLOCK(inp); 227 1.1 rjs INP_INFO_WUNLOCK(&dccpbinfo); 228 1.1 rjs return error; 229 1.1 rjs } 230 1.1 rjs 231 1.1 rjs 232 1.1 rjs int 233 1.1 rjs dccp6_listen(struct socket *so, struct lwp *l) 234 1.1 rjs { 235 1.13 ozaki struct inpcb *inp; 236 1.1 rjs struct dccpcb *dp; 237 1.1 rjs int error = 0; 238 1.1 rjs 239 1.1 rjs DCCP_DEBUG((LOG_INFO, "Entering dccp6_listen!\n")); 240 1.1 rjs 241 1.1 rjs INP_INFO_RLOCK(&dccpbinfo); 242 1.13 ozaki inp = sotoinpcb(so); 243 1.13 ozaki if (inp == 0) { 244 1.1 rjs INP_INFO_RUNLOCK(&dccpbinfo); 245 1.1 rjs return EINVAL; 246 1.1 rjs } 247 1.1 rjs INP_LOCK(inp); 248 1.1 rjs INP_INFO_RUNLOCK(&dccpbinfo); 249 1.13 ozaki dp = intodccpcb(inp); 250 1.13 ozaki DCCP_DEBUG((LOG_INFO, "Checking inp->inp_lport!\n")); 251 1.13 ozaki if (inp->inp_lport == 0) { 252 1.15 ozaki error = in6pcb_bind(inp, NULL, l); 253 1.1 rjs } 254 1.1 rjs if (error == 0) { 255 1.1 rjs dp->state = DCCPS_LISTEN; 256 1.1 rjs dp->who = DCCP_LISTENER; 257 1.1 rjs dp->seq_snd = 512; 258 1.1 rjs } 259 1.1 rjs INP_UNLOCK(inp); 260 1.1 rjs return error; 261 1.1 rjs } 262 1.1 rjs 263 1.1 rjs int 264 1.3 rtr dccp6_accept(struct socket *so, struct sockaddr *nam) 265 1.1 rjs { 266 1.13 ozaki struct inpcb *inp = NULL; 267 1.1 rjs int error = 0; 268 1.1 rjs 269 1.1 rjs DCCP_DEBUG((LOG_INFO, "Entering dccp6_accept!\n")); 270 1.4 rtr if (nam == NULL) { 271 1.1 rjs return EINVAL; 272 1.1 rjs } 273 1.1 rjs if (so->so_state & SS_ISDISCONNECTED) { 274 1.1 rjs DCCP_DEBUG((LOG_INFO, "so_state && SS_ISDISCONNECTED!, so->state = %i\n", so->so_state)); 275 1.1 rjs return ECONNABORTED; 276 1.1 rjs } 277 1.1 rjs 278 1.1 rjs INP_INFO_RLOCK(&dccpbinfo); 279 1.13 ozaki inp = sotoinpcb(so); 280 1.13 ozaki if (inp == 0) { 281 1.1 rjs INP_INFO_RUNLOCK(&dccpbinfo); 282 1.1 rjs return EINVAL; 283 1.1 rjs } 284 1.1 rjs INP_LOCK(inp); 285 1.1 rjs INP_INFO_RUNLOCK(&dccpbinfo); 286 1.15 ozaki in6pcb_fetch_peeraddr(inp, (struct sockaddr_in6 *)nam); 287 1.1 rjs 288 1.1 rjs INP_UNLOCK(inp); 289 1.1 rjs return error; 290 1.1 rjs } 291 1.1 rjs 292 1.1 rjs static int 293 1.1 rjs dccp6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) 294 1.1 rjs { 295 1.1 rjs int error = 0; 296 1.1 rjs int family; 297 1.1 rjs 298 1.1 rjs family = so->so_proto->pr_domain->dom_family; 299 1.1 rjs switch (family) { 300 1.1 rjs case PF_INET6: 301 1.1 rjs error = in6_control(so, cmd, nam, ifp); 302 1.1 rjs break; 303 1.1 rjs default: 304 1.1 rjs error = EAFNOSUPPORT; 305 1.1 rjs } 306 1.1 rjs return (error); 307 1.1 rjs } 308 1.1 rjs 309 1.1 rjs static int 310 1.1 rjs dccp6_stat(struct socket *so, struct stat *ub) 311 1.1 rjs { 312 1.1 rjs return 0; 313 1.1 rjs } 314 1.1 rjs 315 1.1 rjs static int 316 1.1 rjs dccp6_purgeif(struct socket *so, struct ifnet *ifp) 317 1.1 rjs { 318 1.1 rjs int s; 319 1.1 rjs 320 1.1 rjs s = splsoftnet(); 321 1.1 rjs mutex_enter(softnet_lock); 322 1.15 ozaki in6pcb_purgeif0(&dccpbtable, ifp); 323 1.11 ozaki #ifdef NET_MPSAFE 324 1.11 ozaki mutex_exit(softnet_lock); 325 1.9 knakahar #endif 326 1.1 rjs in6_purgeif(ifp); 327 1.11 ozaki #ifdef NET_MPSAFE 328 1.11 ozaki mutex_enter(softnet_lock); 329 1.11 ozaki #endif 330 1.15 ozaki in6pcb_purgeif(&dccpbtable, ifp); 331 1.1 rjs mutex_exit(softnet_lock); 332 1.1 rjs splx(s); 333 1.1 rjs 334 1.1 rjs return 0; 335 1.1 rjs } 336 1.1 rjs 337 1.1 rjs static int 338 1.1 rjs dccp6_attach(struct socket *so, int proto) 339 1.1 rjs { 340 1.1 rjs return dccp_attach(so, proto); 341 1.1 rjs } 342 1.1 rjs 343 1.1 rjs static int 344 1.1 rjs dccp6_detach(struct socket *so) 345 1.1 rjs { 346 1.1 rjs return dccp_detach(so); 347 1.1 rjs } 348 1.1 rjs 349 1.1 rjs static int 350 1.1 rjs dccp6_connect2(struct socket *so, struct socket *so2) 351 1.1 rjs { 352 1.1 rjs KASSERT(solocked(so)); 353 1.1 rjs 354 1.1 rjs return EOPNOTSUPP; 355 1.1 rjs } 356 1.1 rjs 357 1.1 rjs static int 358 1.1 rjs dccp6_disconnect(struct socket *so) 359 1.1 rjs { 360 1.1 rjs return dccp_disconnect(so); 361 1.1 rjs } 362 1.1 rjs 363 1.1 rjs static int 364 1.1 rjs dccp6_shutdown(struct socket *so) 365 1.1 rjs { 366 1.1 rjs return dccp_shutdown(so); 367 1.1 rjs } 368 1.1 rjs 369 1.1 rjs static int 370 1.1 rjs dccp6_abort(struct socket *so) 371 1.1 rjs { 372 1.1 rjs return dccp_abort(so); 373 1.1 rjs } 374 1.1 rjs 375 1.1 rjs 376 1.1 rjs static int 377 1.3 rtr dccp6_peeraddr(struct socket *so, struct sockaddr *nam) 378 1.1 rjs { 379 1.1 rjs KASSERT(solocked(so)); 380 1.1 rjs KASSERT(sotoinpcb(so) != NULL); 381 1.1 rjs KASSERT(nam != NULL); 382 1.1 rjs 383 1.15 ozaki in6pcb_fetch_peeraddr(sotoinpcb(so), (struct sockaddr_in6 *)nam); 384 1.1 rjs return 0; 385 1.1 rjs } 386 1.1 rjs 387 1.1 rjs static int 388 1.3 rtr dccp6_sockaddr(struct socket *so, struct sockaddr *nam) 389 1.1 rjs { 390 1.1 rjs KASSERT(solocked(so)); 391 1.1 rjs KASSERT(sotoinpcb(so) != NULL); 392 1.1 rjs KASSERT(nam != NULL); 393 1.1 rjs 394 1.15 ozaki in6pcb_fetch_sockaddr(sotoinpcb(so), (struct sockaddr_in6 *)nam); 395 1.1 rjs return 0; 396 1.1 rjs } 397 1.1 rjs 398 1.1 rjs static int 399 1.1 rjs dccp6_recvoob(struct socket *so, struct mbuf *m, int flags) 400 1.1 rjs { 401 1.1 rjs KASSERT(solocked(so)); 402 1.1 rjs 403 1.1 rjs return EOPNOTSUPP; 404 1.1 rjs } 405 1.1 rjs 406 1.1 rjs static int 407 1.1 rjs dccp6_rcvd(struct socket *so, int flags, struct lwp *l) 408 1.1 rjs { 409 1.1 rjs KASSERT(solocked(so)); 410 1.1 rjs 411 1.1 rjs return EOPNOTSUPP; 412 1.1 rjs } 413 1.1 rjs 414 1.1 rjs static int 415 1.6 rtr dccp6_send(struct socket *so, struct mbuf *m, struct sockaddr *nam, 416 1.1 rjs struct mbuf *control, struct lwp *l) 417 1.1 rjs { 418 1.1 rjs return dccp_send(so, m, nam, control, l); 419 1.1 rjs } 420 1.1 rjs 421 1.1 rjs static int 422 1.1 rjs dccp6_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) 423 1.1 rjs { 424 1.1 rjs KASSERT(solocked(so)); 425 1.1 rjs 426 1.1 rjs m_freem(m); 427 1.1 rjs m_freem(control); 428 1.1 rjs 429 1.1 rjs return EOPNOTSUPP; 430 1.1 rjs } 431 1.1 rjs 432 1.1 rjs 433 1.1 rjs PR_WRAP_USRREQS(dccp6) 434 1.1 rjs #define dccp6_attach dccp6_attach_wrapper 435 1.1 rjs #define dccp6_detach dccp6_detach_wrapper 436 1.1 rjs #define dccp6_accept dccp6_accept_wrapper 437 1.1 rjs #define dccp6_bind dccp6_bind_wrapper 438 1.1 rjs #define dccp6_listen dccp6_listen_wrapper 439 1.1 rjs #define dccp6_connect dccp6_connect_wrapper 440 1.1 rjs #define dccp6_connect2 dccp6_connect2_wrapper 441 1.1 rjs #define dccp6_disconnect dccp6_disconnect_wrapper 442 1.1 rjs #define dccp6_shutdown dccp6_shutdown_wrapper 443 1.1 rjs #define dccp6_abort dccp6_abort_wrapper 444 1.1 rjs #define dccp6_ioctl dccp6_ioctl_wrapper 445 1.1 rjs #define dccp6_stat dccp6_stat_wrapper 446 1.1 rjs #define dccp6_peeraddr dccp6_peeraddr_wrapper 447 1.1 rjs #define dccp6_sockaddr dccp6_sockaddr_wrapper 448 1.1 rjs #define dccp6_rcvd dccp6_rcvd_wrapper 449 1.1 rjs #define dccp6_recvoob dccp6_recvoob_wrapper 450 1.1 rjs #define dccp6_send dccp6_send_wrapper 451 1.1 rjs #define dccp6_sendoob dccp6_sendoob_wrapper 452 1.1 rjs #define dccp6_purgeif dccp6_purgeif_wrapper 453 1.1 rjs 454 1.1 rjs const struct pr_usrreqs dccp6_usrreqs = { 455 1.1 rjs .pr_attach = dccp6_attach, 456 1.1 rjs .pr_detach = dccp6_detach, 457 1.1 rjs .pr_accept = dccp6_accept, 458 1.1 rjs .pr_bind = dccp6_bind, 459 1.1 rjs .pr_listen = dccp6_listen, 460 1.1 rjs .pr_connect = dccp6_connect, 461 1.1 rjs .pr_connect2 = dccp6_connect2, 462 1.1 rjs .pr_disconnect = dccp6_disconnect, 463 1.1 rjs .pr_shutdown = dccp6_shutdown, 464 1.1 rjs .pr_abort = dccp6_abort, 465 1.1 rjs .pr_ioctl = dccp6_ioctl, 466 1.1 rjs .pr_stat = dccp6_stat, 467 1.1 rjs .pr_peeraddr = dccp6_peeraddr, 468 1.1 rjs .pr_sockaddr = dccp6_sockaddr, 469 1.1 rjs .pr_rcvd = dccp6_rcvd, 470 1.1 rjs .pr_recvoob = dccp6_recvoob, 471 1.1 rjs .pr_send = dccp6_send, 472 1.1 rjs .pr_sendoob = dccp6_sendoob, 473 1.1 rjs .pr_purgeif = dccp6_purgeif, 474 1.1 rjs }; 475