1 /*- 2 * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved. 3 * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. 4 * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * a) Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * b) Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the distribution. 15 * 16 * c) Neither the name of Cisco Systems, Inc. nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD$"); 35 36 #include <netinet/sctp_os.h> 37 #include <netinet/sctp_pcb.h> 38 #include <netinet/sctputil.h> 39 #include <netinet/sctp_var.h> 40 #include <netinet/sctp_sysctl.h> 41 #ifdef INET6 42 #include <netinet6/sctp6_var.h> 43 #endif 44 #include <netinet/sctp_header.h> 45 #include <netinet/sctp_output.h> 46 #include <netinet/sctp_uio.h> 47 #include <netinet/sctp_timer.h> 48 #include <netinet/sctp_indata.h>/* for sctp_deliver_data() */ 49 #include <netinet/sctp_auth.h> 50 #include <netinet/sctp_asconf.h> 51 #include <netinet/sctp_bsd_addr.h> 52 #if defined(INET6) || defined(INET) 53 #include <netinet/tcp_var.h> 54 #endif 55 #include <netinet/udp.h> 56 #include <netinet/udp_var.h> 57 #include <sys/proc.h> 58 #ifdef INET6 59 #include <netinet/icmp6.h> 60 #endif 61 62 63 #ifndef KTR_SCTP 64 #define KTR_SCTP KTR_SUBSYS 65 #endif 66 67 extern const struct sctp_cc_functions sctp_cc_functions[]; 68 extern const struct sctp_ss_functions sctp_ss_functions[]; 69 70 void 71 sctp_sblog(struct sockbuf *sb, struct sctp_tcb *stcb, int from, int incr) 72 { 73 struct sctp_cwnd_log sctp_clog; 74 75 sctp_clog.x.sb.stcb = stcb; 76 sctp_clog.x.sb.so_sbcc = sb->sb_cc; 77 if (stcb) 78 sctp_clog.x.sb.stcb_sbcc = stcb->asoc.sb_cc; 79 else 80 sctp_clog.x.sb.stcb_sbcc = 0; 81 sctp_clog.x.sb.incr = incr; 82 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 83 SCTP_LOG_EVENT_SB, 84 from, 85 sctp_clog.x.misc.log1, 86 sctp_clog.x.misc.log2, 87 sctp_clog.x.misc.log3, 88 sctp_clog.x.misc.log4); 89 } 90 91 void 92 sctp_log_closing(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int16_t loc) 93 { 94 struct sctp_cwnd_log sctp_clog; 95 96 sctp_clog.x.close.inp = (void *)inp; 97 sctp_clog.x.close.sctp_flags = inp->sctp_flags; 98 if (stcb) { 99 sctp_clog.x.close.stcb = (void *)stcb; 100 sctp_clog.x.close.state = (uint16_t)stcb->asoc.state; 101 } else { 102 sctp_clog.x.close.stcb = 0; 103 sctp_clog.x.close.state = 0; 104 } 105 sctp_clog.x.close.loc = loc; 106 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 107 SCTP_LOG_EVENT_CLOSE, 108 0, 109 sctp_clog.x.misc.log1, 110 sctp_clog.x.misc.log2, 111 sctp_clog.x.misc.log3, 112 sctp_clog.x.misc.log4); 113 } 114 115 void 116 rto_logging(struct sctp_nets *net, int from) 117 { 118 struct sctp_cwnd_log sctp_clog; 119 120 memset(&sctp_clog, 0, sizeof(sctp_clog)); 121 sctp_clog.x.rto.net = (void *)net; 122 sctp_clog.x.rto.rtt = net->rtt / 1000; 123 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 124 SCTP_LOG_EVENT_RTT, 125 from, 126 sctp_clog.x.misc.log1, 127 sctp_clog.x.misc.log2, 128 sctp_clog.x.misc.log3, 129 sctp_clog.x.misc.log4); 130 } 131 132 void 133 sctp_log_strm_del_alt(struct sctp_tcb *stcb, uint32_t tsn, uint16_t sseq, uint16_t stream, int from) 134 { 135 struct sctp_cwnd_log sctp_clog; 136 137 sctp_clog.x.strlog.stcb = stcb; 138 sctp_clog.x.strlog.n_tsn = tsn; 139 sctp_clog.x.strlog.n_sseq = sseq; 140 sctp_clog.x.strlog.e_tsn = 0; 141 sctp_clog.x.strlog.e_sseq = 0; 142 sctp_clog.x.strlog.strm = stream; 143 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 144 SCTP_LOG_EVENT_STRM, 145 from, 146 sctp_clog.x.misc.log1, 147 sctp_clog.x.misc.log2, 148 sctp_clog.x.misc.log3, 149 sctp_clog.x.misc.log4); 150 } 151 152 void 153 sctp_log_nagle_event(struct sctp_tcb *stcb, int action) 154 { 155 struct sctp_cwnd_log sctp_clog; 156 157 sctp_clog.x.nagle.stcb = (void *)stcb; 158 sctp_clog.x.nagle.total_flight = stcb->asoc.total_flight; 159 sctp_clog.x.nagle.total_in_queue = stcb->asoc.total_output_queue_size; 160 sctp_clog.x.nagle.count_in_queue = stcb->asoc.chunks_on_out_queue; 161 sctp_clog.x.nagle.count_in_flight = stcb->asoc.total_flight_count; 162 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 163 SCTP_LOG_EVENT_NAGLE, 164 action, 165 sctp_clog.x.misc.log1, 166 sctp_clog.x.misc.log2, 167 sctp_clog.x.misc.log3, 168 sctp_clog.x.misc.log4); 169 } 170 171 void 172 sctp_log_sack(uint32_t old_cumack, uint32_t cumack, uint32_t tsn, uint16_t gaps, uint16_t dups, int from) 173 { 174 struct sctp_cwnd_log sctp_clog; 175 176 sctp_clog.x.sack.cumack = cumack; 177 sctp_clog.x.sack.oldcumack = old_cumack; 178 sctp_clog.x.sack.tsn = tsn; 179 sctp_clog.x.sack.numGaps = gaps; 180 sctp_clog.x.sack.numDups = dups; 181 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 182 SCTP_LOG_EVENT_SACK, 183 from, 184 sctp_clog.x.misc.log1, 185 sctp_clog.x.misc.log2, 186 sctp_clog.x.misc.log3, 187 sctp_clog.x.misc.log4); 188 } 189 190 void 191 sctp_log_map(uint32_t map, uint32_t cum, uint32_t high, int from) 192 { 193 struct sctp_cwnd_log sctp_clog; 194 195 memset(&sctp_clog, 0, sizeof(sctp_clog)); 196 sctp_clog.x.map.base = map; 197 sctp_clog.x.map.cum = cum; 198 sctp_clog.x.map.high = high; 199 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 200 SCTP_LOG_EVENT_MAP, 201 from, 202 sctp_clog.x.misc.log1, 203 sctp_clog.x.misc.log2, 204 sctp_clog.x.misc.log3, 205 sctp_clog.x.misc.log4); 206 } 207 208 void 209 sctp_log_fr(uint32_t biggest_tsn, uint32_t biggest_new_tsn, uint32_t tsn, int from) 210 { 211 struct sctp_cwnd_log sctp_clog; 212 213 memset(&sctp_clog, 0, sizeof(sctp_clog)); 214 sctp_clog.x.fr.largest_tsn = biggest_tsn; 215 sctp_clog.x.fr.largest_new_tsn = biggest_new_tsn; 216 sctp_clog.x.fr.tsn = tsn; 217 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 218 SCTP_LOG_EVENT_FR, 219 from, 220 sctp_clog.x.misc.log1, 221 sctp_clog.x.misc.log2, 222 sctp_clog.x.misc.log3, 223 sctp_clog.x.misc.log4); 224 } 225 226 #ifdef SCTP_MBUF_LOGGING 227 void 228 sctp_log_mb(struct mbuf *m, int from) 229 { 230 struct sctp_cwnd_log sctp_clog; 231 232 sctp_clog.x.mb.mp = m; 233 sctp_clog.x.mb.mbuf_flags = (uint8_t)(SCTP_BUF_GET_FLAGS(m)); 234 sctp_clog.x.mb.size = (uint16_t)(SCTP_BUF_LEN(m)); 235 sctp_clog.x.mb.data = SCTP_BUF_AT(m, 0); 236 if (SCTP_BUF_IS_EXTENDED(m)) { 237 sctp_clog.x.mb.ext = SCTP_BUF_EXTEND_BASE(m); 238 sctp_clog.x.mb.refcnt = (uint8_t)(SCTP_BUF_EXTEND_REFCNT(m)); 239 } else { 240 sctp_clog.x.mb.ext = 0; 241 sctp_clog.x.mb.refcnt = 0; 242 } 243 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 244 SCTP_LOG_EVENT_MBUF, 245 from, 246 sctp_clog.x.misc.log1, 247 sctp_clog.x.misc.log2, 248 sctp_clog.x.misc.log3, 249 sctp_clog.x.misc.log4); 250 } 251 252 void 253 sctp_log_mbc(struct mbuf *m, int from) 254 { 255 struct mbuf *mat; 256 257 for (mat = m; mat; mat = SCTP_BUF_NEXT(mat)) { 258 sctp_log_mb(mat, from); 259 } 260 } 261 #endif 262 263 void 264 sctp_log_strm_del(struct sctp_queued_to_read *control, struct sctp_queued_to_read *poschk, int from) 265 { 266 struct sctp_cwnd_log sctp_clog; 267 268 if (control == NULL) { 269 SCTP_PRINTF("Gak log of NULL?\n"); 270 return; 271 } 272 sctp_clog.x.strlog.stcb = control->stcb; 273 sctp_clog.x.strlog.n_tsn = control->sinfo_tsn; 274 sctp_clog.x.strlog.n_sseq = (uint16_t)control->mid; 275 sctp_clog.x.strlog.strm = control->sinfo_stream; 276 if (poschk != NULL) { 277 sctp_clog.x.strlog.e_tsn = poschk->sinfo_tsn; 278 sctp_clog.x.strlog.e_sseq = (uint16_t)poschk->mid; 279 } else { 280 sctp_clog.x.strlog.e_tsn = 0; 281 sctp_clog.x.strlog.e_sseq = 0; 282 } 283 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 284 SCTP_LOG_EVENT_STRM, 285 from, 286 sctp_clog.x.misc.log1, 287 sctp_clog.x.misc.log2, 288 sctp_clog.x.misc.log3, 289 sctp_clog.x.misc.log4); 290 } 291 292 void 293 sctp_log_cwnd(struct sctp_tcb *stcb, struct sctp_nets *net, int augment, uint8_t from) 294 { 295 struct sctp_cwnd_log sctp_clog; 296 297 sctp_clog.x.cwnd.net = net; 298 if (stcb->asoc.send_queue_cnt > 255) 299 sctp_clog.x.cwnd.cnt_in_send = 255; 300 else 301 sctp_clog.x.cwnd.cnt_in_send = stcb->asoc.send_queue_cnt; 302 if (stcb->asoc.stream_queue_cnt > 255) 303 sctp_clog.x.cwnd.cnt_in_str = 255; 304 else 305 sctp_clog.x.cwnd.cnt_in_str = stcb->asoc.stream_queue_cnt; 306 307 if (net) { 308 sctp_clog.x.cwnd.cwnd_new_value = net->cwnd; 309 sctp_clog.x.cwnd.inflight = net->flight_size; 310 sctp_clog.x.cwnd.pseudo_cumack = net->pseudo_cumack; 311 sctp_clog.x.cwnd.meets_pseudo_cumack = net->new_pseudo_cumack; 312 sctp_clog.x.cwnd.need_new_pseudo_cumack = net->find_pseudo_cumack; 313 } 314 if (SCTP_CWNDLOG_PRESEND == from) { 315 sctp_clog.x.cwnd.meets_pseudo_cumack = stcb->asoc.peers_rwnd; 316 } 317 sctp_clog.x.cwnd.cwnd_augment = augment; 318 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 319 SCTP_LOG_EVENT_CWND, 320 from, 321 sctp_clog.x.misc.log1, 322 sctp_clog.x.misc.log2, 323 sctp_clog.x.misc.log3, 324 sctp_clog.x.misc.log4); 325 } 326 327 void 328 sctp_log_lock(struct sctp_inpcb *inp, struct sctp_tcb *stcb, uint8_t from) 329 { 330 struct sctp_cwnd_log sctp_clog; 331 332 memset(&sctp_clog, 0, sizeof(sctp_clog)); 333 if (inp) { 334 sctp_clog.x.lock.sock = (void *)inp->sctp_socket; 335 336 } else { 337 sctp_clog.x.lock.sock = (void *)NULL; 338 } 339 sctp_clog.x.lock.inp = (void *)inp; 340 if (stcb) { 341 sctp_clog.x.lock.tcb_lock = mtx_owned(&stcb->tcb_mtx); 342 } else { 343 sctp_clog.x.lock.tcb_lock = SCTP_LOCK_UNKNOWN; 344 } 345 if (inp) { 346 sctp_clog.x.lock.inp_lock = mtx_owned(&inp->inp_mtx); 347 sctp_clog.x.lock.create_lock = mtx_owned(&inp->inp_create_mtx); 348 } else { 349 sctp_clog.x.lock.inp_lock = SCTP_LOCK_UNKNOWN; 350 sctp_clog.x.lock.create_lock = SCTP_LOCK_UNKNOWN; 351 } 352 sctp_clog.x.lock.info_lock = rw_wowned(&SCTP_BASE_INFO(ipi_ep_mtx)); 353 if (inp && (inp->sctp_socket)) { 354 sctp_clog.x.lock.sock_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx)); 355 sctp_clog.x.lock.sockrcvbuf_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx)); 356 sctp_clog.x.lock.socksndbuf_lock = mtx_owned(&(inp->sctp_socket->so_snd.sb_mtx)); 357 } else { 358 sctp_clog.x.lock.sock_lock = SCTP_LOCK_UNKNOWN; 359 sctp_clog.x.lock.sockrcvbuf_lock = SCTP_LOCK_UNKNOWN; 360 sctp_clog.x.lock.socksndbuf_lock = SCTP_LOCK_UNKNOWN; 361 } 362 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 363 SCTP_LOG_LOCK_EVENT, 364 from, 365 sctp_clog.x.misc.log1, 366 sctp_clog.x.misc.log2, 367 sctp_clog.x.misc.log3, 368 sctp_clog.x.misc.log4); 369 } 370 371 void 372 sctp_log_maxburst(struct sctp_tcb *stcb, struct sctp_nets *net, int error, int burst, uint8_t from) 373 { 374 struct sctp_cwnd_log sctp_clog; 375 376 memset(&sctp_clog, 0, sizeof(sctp_clog)); 377 sctp_clog.x.cwnd.net = net; 378 sctp_clog.x.cwnd.cwnd_new_value = error; 379 sctp_clog.x.cwnd.inflight = net->flight_size; 380 sctp_clog.x.cwnd.cwnd_augment = burst; 381 if (stcb->asoc.send_queue_cnt > 255) 382 sctp_clog.x.cwnd.cnt_in_send = 255; 383 else 384 sctp_clog.x.cwnd.cnt_in_send = stcb->asoc.send_queue_cnt; 385 if (stcb->asoc.stream_queue_cnt > 255) 386 sctp_clog.x.cwnd.cnt_in_str = 255; 387 else 388 sctp_clog.x.cwnd.cnt_in_str = stcb->asoc.stream_queue_cnt; 389 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 390 SCTP_LOG_EVENT_MAXBURST, 391 from, 392 sctp_clog.x.misc.log1, 393 sctp_clog.x.misc.log2, 394 sctp_clog.x.misc.log3, 395 sctp_clog.x.misc.log4); 396 } 397 398 void 399 sctp_log_rwnd(uint8_t from, uint32_t peers_rwnd, uint32_t snd_size, uint32_t overhead) 400 { 401 struct sctp_cwnd_log sctp_clog; 402 403 sctp_clog.x.rwnd.rwnd = peers_rwnd; 404 sctp_clog.x.rwnd.send_size = snd_size; 405 sctp_clog.x.rwnd.overhead = overhead; 406 sctp_clog.x.rwnd.new_rwnd = 0; 407 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 408 SCTP_LOG_EVENT_RWND, 409 from, 410 sctp_clog.x.misc.log1, 411 sctp_clog.x.misc.log2, 412 sctp_clog.x.misc.log3, 413 sctp_clog.x.misc.log4); 414 } 415 416 void 417 sctp_log_rwnd_set(uint8_t from, uint32_t peers_rwnd, uint32_t flight_size, uint32_t overhead, uint32_t a_rwndval) 418 { 419 struct sctp_cwnd_log sctp_clog; 420 421 sctp_clog.x.rwnd.rwnd = peers_rwnd; 422 sctp_clog.x.rwnd.send_size = flight_size; 423 sctp_clog.x.rwnd.overhead = overhead; 424 sctp_clog.x.rwnd.new_rwnd = a_rwndval; 425 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 426 SCTP_LOG_EVENT_RWND, 427 from, 428 sctp_clog.x.misc.log1, 429 sctp_clog.x.misc.log2, 430 sctp_clog.x.misc.log3, 431 sctp_clog.x.misc.log4); 432 } 433 434 #ifdef SCTP_MBCNT_LOGGING 435 static void 436 sctp_log_mbcnt(uint8_t from, uint32_t total_oq, uint32_t book, uint32_t total_mbcnt_q, uint32_t mbcnt) 437 { 438 struct sctp_cwnd_log sctp_clog; 439 440 sctp_clog.x.mbcnt.total_queue_size = total_oq; 441 sctp_clog.x.mbcnt.size_change = book; 442 sctp_clog.x.mbcnt.total_queue_mb_size = total_mbcnt_q; 443 sctp_clog.x.mbcnt.mbcnt_change = mbcnt; 444 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 445 SCTP_LOG_EVENT_MBCNT, 446 from, 447 sctp_clog.x.misc.log1, 448 sctp_clog.x.misc.log2, 449 sctp_clog.x.misc.log3, 450 sctp_clog.x.misc.log4); 451 } 452 #endif 453 454 void 455 sctp_misc_ints(uint8_t from, uint32_t a, uint32_t b, uint32_t c, uint32_t d) 456 { 457 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 458 SCTP_LOG_MISC_EVENT, 459 from, 460 a, b, c, d); 461 } 462 463 void 464 sctp_wakeup_log(struct sctp_tcb *stcb, uint32_t wake_cnt, int from) 465 { 466 struct sctp_cwnd_log sctp_clog; 467 468 sctp_clog.x.wake.stcb = (void *)stcb; 469 sctp_clog.x.wake.wake_cnt = wake_cnt; 470 sctp_clog.x.wake.flight = stcb->asoc.total_flight_count; 471 sctp_clog.x.wake.send_q = stcb->asoc.send_queue_cnt; 472 sctp_clog.x.wake.sent_q = stcb->asoc.sent_queue_cnt; 473 474 if (stcb->asoc.stream_queue_cnt < 0xff) 475 sctp_clog.x.wake.stream_qcnt = (uint8_t)stcb->asoc.stream_queue_cnt; 476 else 477 sctp_clog.x.wake.stream_qcnt = 0xff; 478 479 if (stcb->asoc.chunks_on_out_queue < 0xff) 480 sctp_clog.x.wake.chunks_on_oque = (uint8_t)stcb->asoc.chunks_on_out_queue; 481 else 482 sctp_clog.x.wake.chunks_on_oque = 0xff; 483 484 sctp_clog.x.wake.sctpflags = 0; 485 /* set in the defered mode stuff */ 486 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) 487 sctp_clog.x.wake.sctpflags |= 1; 488 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_WAKEOUTPUT) 489 sctp_clog.x.wake.sctpflags |= 2; 490 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_WAKEINPUT) 491 sctp_clog.x.wake.sctpflags |= 4; 492 /* what about the sb */ 493 if (stcb->sctp_socket) { 494 struct socket *so = stcb->sctp_socket; 495 496 sctp_clog.x.wake.sbflags = (uint8_t)((so->so_snd.sb_flags & 0x00ff)); 497 } else { 498 sctp_clog.x.wake.sbflags = 0xff; 499 } 500 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 501 SCTP_LOG_EVENT_WAKE, 502 from, 503 sctp_clog.x.misc.log1, 504 sctp_clog.x.misc.log2, 505 sctp_clog.x.misc.log3, 506 sctp_clog.x.misc.log4); 507 } 508 509 void 510 sctp_log_block(uint8_t from, struct sctp_association *asoc, size_t sendlen) 511 { 512 struct sctp_cwnd_log sctp_clog; 513 514 sctp_clog.x.blk.onsb = asoc->total_output_queue_size; 515 sctp_clog.x.blk.send_sent_qcnt = (uint16_t)(asoc->send_queue_cnt + asoc->sent_queue_cnt); 516 sctp_clog.x.blk.peer_rwnd = asoc->peers_rwnd; 517 sctp_clog.x.blk.stream_qcnt = (uint16_t)asoc->stream_queue_cnt; 518 sctp_clog.x.blk.chunks_on_oque = (uint16_t)asoc->chunks_on_out_queue; 519 sctp_clog.x.blk.flight_size = (uint16_t)(asoc->total_flight / 1024); 520 sctp_clog.x.blk.sndlen = (uint32_t)sendlen; 521 SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x", 522 SCTP_LOG_EVENT_BLOCK, 523 from, 524 sctp_clog.x.misc.log1, 525 sctp_clog.x.misc.log2, 526 sctp_clog.x.misc.log3, 527 sctp_clog.x.misc.log4); 528 } 529 530 int 531 sctp_fill_stat_log(void *optval SCTP_UNUSED, size_t *optsize SCTP_UNUSED) 532 { 533 /* May need to fix this if ktrdump does not work */ 534 return (0); 535 } 536 537 #ifdef SCTP_AUDITING_ENABLED 538 uint8_t sctp_audit_data[SCTP_AUDIT_SIZE][2]; 539 static int sctp_audit_indx = 0; 540 541 static 542 void 543 sctp_print_audit_report(void) 544 { 545 int i; 546 int cnt; 547 548 cnt = 0; 549 for (i = sctp_audit_indx; i < SCTP_AUDIT_SIZE; i++) { 550 if ((sctp_audit_data[i][0] == 0xe0) && 551 (sctp_audit_data[i][1] == 0x01)) { 552 cnt = 0; 553 SCTP_PRINTF("\n"); 554 } else if (sctp_audit_data[i][0] == 0xf0) { 555 cnt = 0; 556 SCTP_PRINTF("\n"); 557 } else if ((sctp_audit_data[i][0] == 0xc0) && 558 (sctp_audit_data[i][1] == 0x01)) { 559 SCTP_PRINTF("\n"); 560 cnt = 0; 561 } 562 SCTP_PRINTF("%2.2x%2.2x ", (uint32_t)sctp_audit_data[i][0], 563 (uint32_t)sctp_audit_data[i][1]); 564 cnt++; 565 if ((cnt % 14) == 0) 566 SCTP_PRINTF("\n"); 567 } 568 for (i = 0; i < sctp_audit_indx; i++) { 569 if ((sctp_audit_data[i][0] == 0xe0) && 570 (sctp_audit_data[i][1] == 0x01)) { 571 cnt = 0; 572 SCTP_PRINTF("\n"); 573 } else if (sctp_audit_data[i][0] == 0xf0) { 574 cnt = 0; 575 SCTP_PRINTF("\n"); 576 } else if ((sctp_audit_data[i][0] == 0xc0) && 577 (sctp_audit_data[i][1] == 0x01)) { 578 SCTP_PRINTF("\n"); 579 cnt = 0; 580 } 581 SCTP_PRINTF("%2.2x%2.2x ", (uint32_t)sctp_audit_data[i][0], 582 (uint32_t)sctp_audit_data[i][1]); 583 cnt++; 584 if ((cnt % 14) == 0) 585 SCTP_PRINTF("\n"); 586 } 587 SCTP_PRINTF("\n"); 588 } 589 590 void 591 sctp_auditing(int from, struct sctp_inpcb *inp, struct sctp_tcb *stcb, 592 struct sctp_nets *net) 593 { 594 int resend_cnt, tot_out, rep, tot_book_cnt; 595 struct sctp_nets *lnet; 596 struct sctp_tmit_chunk *chk; 597 598 sctp_audit_data[sctp_audit_indx][0] = 0xAA; 599 sctp_audit_data[sctp_audit_indx][1] = 0x000000ff & from; 600 sctp_audit_indx++; 601 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 602 sctp_audit_indx = 0; 603 } 604 if (inp == NULL) { 605 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 606 sctp_audit_data[sctp_audit_indx][1] = 0x01; 607 sctp_audit_indx++; 608 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 609 sctp_audit_indx = 0; 610 } 611 return; 612 } 613 if (stcb == NULL) { 614 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 615 sctp_audit_data[sctp_audit_indx][1] = 0x02; 616 sctp_audit_indx++; 617 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 618 sctp_audit_indx = 0; 619 } 620 return; 621 } 622 sctp_audit_data[sctp_audit_indx][0] = 0xA1; 623 sctp_audit_data[sctp_audit_indx][1] = 624 (0x000000ff & stcb->asoc.sent_queue_retran_cnt); 625 sctp_audit_indx++; 626 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 627 sctp_audit_indx = 0; 628 } 629 rep = 0; 630 tot_book_cnt = 0; 631 resend_cnt = tot_out = 0; 632 TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { 633 if (chk->sent == SCTP_DATAGRAM_RESEND) { 634 resend_cnt++; 635 } else if (chk->sent < SCTP_DATAGRAM_RESEND) { 636 tot_out += chk->book_size; 637 tot_book_cnt++; 638 } 639 } 640 if (resend_cnt != stcb->asoc.sent_queue_retran_cnt) { 641 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 642 sctp_audit_data[sctp_audit_indx][1] = 0xA1; 643 sctp_audit_indx++; 644 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 645 sctp_audit_indx = 0; 646 } 647 SCTP_PRINTF("resend_cnt:%d asoc-tot:%d\n", 648 resend_cnt, stcb->asoc.sent_queue_retran_cnt); 649 rep = 1; 650 stcb->asoc.sent_queue_retran_cnt = resend_cnt; 651 sctp_audit_data[sctp_audit_indx][0] = 0xA2; 652 sctp_audit_data[sctp_audit_indx][1] = 653 (0x000000ff & stcb->asoc.sent_queue_retran_cnt); 654 sctp_audit_indx++; 655 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 656 sctp_audit_indx = 0; 657 } 658 } 659 if (tot_out != stcb->asoc.total_flight) { 660 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 661 sctp_audit_data[sctp_audit_indx][1] = 0xA2; 662 sctp_audit_indx++; 663 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 664 sctp_audit_indx = 0; 665 } 666 rep = 1; 667 SCTP_PRINTF("tot_flt:%d asoc_tot:%d\n", tot_out, 668 (int)stcb->asoc.total_flight); 669 stcb->asoc.total_flight = tot_out; 670 } 671 if (tot_book_cnt != stcb->asoc.total_flight_count) { 672 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 673 sctp_audit_data[sctp_audit_indx][1] = 0xA5; 674 sctp_audit_indx++; 675 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 676 sctp_audit_indx = 0; 677 } 678 rep = 1; 679 SCTP_PRINTF("tot_flt_book:%d\n", tot_book_cnt); 680 681 stcb->asoc.total_flight_count = tot_book_cnt; 682 } 683 tot_out = 0; 684 TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { 685 tot_out += lnet->flight_size; 686 } 687 if (tot_out != stcb->asoc.total_flight) { 688 sctp_audit_data[sctp_audit_indx][0] = 0xAF; 689 sctp_audit_data[sctp_audit_indx][1] = 0xA3; 690 sctp_audit_indx++; 691 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 692 sctp_audit_indx = 0; 693 } 694 rep = 1; 695 SCTP_PRINTF("real flight:%d net total was %d\n", 696 stcb->asoc.total_flight, tot_out); 697 /* now corrective action */ 698 TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { 699 700 tot_out = 0; 701 TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { 702 if ((chk->whoTo == lnet) && 703 (chk->sent < SCTP_DATAGRAM_RESEND)) { 704 tot_out += chk->book_size; 705 } 706 } 707 if (lnet->flight_size != tot_out) { 708 SCTP_PRINTF("net:%p flight was %d corrected to %d\n", 709 (void *)lnet, lnet->flight_size, 710 tot_out); 711 lnet->flight_size = tot_out; 712 } 713 } 714 } 715 if (rep) { 716 sctp_print_audit_report(); 717 } 718 } 719 720 void 721 sctp_audit_log(uint8_t ev, uint8_t fd) 722 { 723 724 sctp_audit_data[sctp_audit_indx][0] = ev; 725 sctp_audit_data[sctp_audit_indx][1] = fd; 726 sctp_audit_indx++; 727 if (sctp_audit_indx >= SCTP_AUDIT_SIZE) { 728 sctp_audit_indx = 0; 729 } 730 } 731 732 #endif 733 734 /* 735 * sctp_stop_timers_for_shutdown() should be called 736 * when entering the SHUTDOWN_SENT or SHUTDOWN_ACK_SENT 737 * state to make sure that all timers are stopped. 738 */ 739 void 740 sctp_stop_timers_for_shutdown(struct sctp_tcb *stcb) 741 { 742 struct sctp_association *asoc; 743 struct sctp_nets *net; 744 745 asoc = &stcb->asoc; 746 747 (void)SCTP_OS_TIMER_STOP(&asoc->dack_timer.timer); 748 (void)SCTP_OS_TIMER_STOP(&asoc->strreset_timer.timer); 749 (void)SCTP_OS_TIMER_STOP(&asoc->asconf_timer.timer); 750 (void)SCTP_OS_TIMER_STOP(&asoc->autoclose_timer.timer); 751 (void)SCTP_OS_TIMER_STOP(&asoc->delayed_event_timer.timer); 752 TAILQ_FOREACH(net, &asoc->nets, sctp_next) { 753 (void)SCTP_OS_TIMER_STOP(&net->pmtu_timer.timer); 754 (void)SCTP_OS_TIMER_STOP(&net->hb_timer.timer); 755 } 756 } 757 758 /* 759 * a list of sizes based on typical mtu's, used only if next hop size not 760 * returned. 761 */ 762 static uint32_t sctp_mtu_sizes[] = { 763 68, 764 296, 765 508, 766 512, 767 544, 768 576, 769 1006, 770 1492, 771 1500, 772 1536, 773 2002, 774 2048, 775 4352, 776 4464, 777 8166, 778 17914, 779 32000, 780 65535 781 }; 782 783 /* 784 * Return the largest MTU smaller than val. If there is no 785 * entry, just return val. 786 */ 787 uint32_t 788 sctp_get_prev_mtu(uint32_t val) 789 { 790 uint32_t i; 791 792 if (val <= sctp_mtu_sizes[0]) { 793 return (val); 794 } 795 for (i = 1; i < (sizeof(sctp_mtu_sizes) / sizeof(uint32_t)); i++) { 796 if (val <= sctp_mtu_sizes[i]) { 797 break; 798 } 799 } 800 return (sctp_mtu_sizes[i - 1]); 801 } 802 803 /* 804 * Return the smallest MTU larger than val. If there is no 805 * entry, just return val. 806 */ 807 uint32_t 808 sctp_get_next_mtu(uint32_t val) 809 { 810 /* select another MTU that is just bigger than this one */ 811 uint32_t i; 812 813 for (i = 0; i < (sizeof(sctp_mtu_sizes) / sizeof(uint32_t)); i++) { 814 if (val < sctp_mtu_sizes[i]) { 815 return (sctp_mtu_sizes[i]); 816 } 817 } 818 return (val); 819 } 820 821 void 822 sctp_fill_random_store(struct sctp_pcb *m) 823 { 824 /* 825 * Here we use the MD5/SHA-1 to hash with our good randomNumbers and 826 * our counter. The result becomes our good random numbers and we 827 * then setup to give these out. Note that we do no locking to 828 * protect this. This is ok, since if competing folks call this we 829 * will get more gobbled gook in the random store which is what we 830 * want. There is a danger that two guys will use the same random 831 * numbers, but thats ok too since that is random as well :-> 832 */ 833 m->store_at = 0; 834 (void)sctp_hmac(SCTP_HMAC, (uint8_t *)m->random_numbers, 835 sizeof(m->random_numbers), (uint8_t *)&m->random_counter, 836 sizeof(m->random_counter), (uint8_t *)m->random_store); 837 m->random_counter++; 838 } 839 840 uint32_t 841 sctp_select_initial_TSN(struct sctp_pcb *inp) 842 { 843 /* 844 * A true implementation should use random selection process to get 845 * the initial stream sequence number, using RFC1750 as a good 846 * guideline 847 */ 848 uint32_t x, *xp; 849 uint8_t *p; 850 int store_at, new_store; 851 852 if (inp->initial_sequence_debug != 0) { 853 uint32_t ret; 854 855 ret = inp->initial_sequence_debug; 856 inp->initial_sequence_debug++; 857 return (ret); 858 } 859 retry: 860 store_at = inp->store_at; 861 new_store = store_at + sizeof(uint32_t); 862 if (new_store >= (SCTP_SIGNATURE_SIZE - 3)) { 863 new_store = 0; 864 } 865 if (!atomic_cmpset_int(&inp->store_at, store_at, new_store)) { 866 goto retry; 867 } 868 if (new_store == 0) { 869 /* Refill the random store */ 870 sctp_fill_random_store(inp); 871 } 872 p = &inp->random_store[store_at]; 873 xp = (uint32_t *)p; 874 x = *xp; 875 return (x); 876 } 877 878 uint32_t 879 sctp_select_a_tag(struct sctp_inpcb *inp, uint16_t lport, uint16_t rport, int check) 880 { 881 uint32_t x; 882 struct timeval now; 883 884 if (check) { 885 (void)SCTP_GETTIME_TIMEVAL(&now); 886 } 887 for (;;) { 888 x = sctp_select_initial_TSN(&inp->sctp_ep); 889 if (x == 0) { 890 /* we never use 0 */ 891 continue; 892 } 893 if (!check || sctp_is_vtag_good(x, lport, rport, &now)) { 894 break; 895 } 896 } 897 return (x); 898 } 899 900 int32_t 901 sctp_map_assoc_state(int kernel_state) 902 { 903 int32_t user_state; 904 905 if (kernel_state & SCTP_STATE_WAS_ABORTED) { 906 user_state = SCTP_CLOSED; 907 } else if (kernel_state & SCTP_STATE_SHUTDOWN_PENDING) { 908 user_state = SCTP_SHUTDOWN_PENDING; 909 } else { 910 switch (kernel_state & SCTP_STATE_MASK) { 911 case SCTP_STATE_EMPTY: 912 user_state = SCTP_CLOSED; 913 break; 914 case SCTP_STATE_INUSE: 915 user_state = SCTP_CLOSED; 916 break; 917 case SCTP_STATE_COOKIE_WAIT: 918 user_state = SCTP_COOKIE_WAIT; 919 break; 920 case SCTP_STATE_COOKIE_ECHOED: 921 user_state = SCTP_COOKIE_ECHOED; 922 break; 923 case SCTP_STATE_OPEN: 924 user_state = SCTP_ESTABLISHED; 925 break; 926 case SCTP_STATE_SHUTDOWN_SENT: 927 user_state = SCTP_SHUTDOWN_SENT; 928 break; 929 case SCTP_STATE_SHUTDOWN_RECEIVED: 930 user_state = SCTP_SHUTDOWN_RECEIVED; 931 break; 932 case SCTP_STATE_SHUTDOWN_ACK_SENT: 933 user_state = SCTP_SHUTDOWN_ACK_SENT; 934 break; 935 default: 936 user_state = SCTP_CLOSED; 937 break; 938 } 939 } 940 return (user_state); 941 } 942 943 int 944 sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 945 uint32_t override_tag, uint32_t vrf_id, uint16_t o_strms) 946 { 947 struct sctp_association *asoc; 948 949 /* 950 * Anything set to zero is taken care of by the allocation routine's 951 * bzero 952 */ 953 954 /* 955 * Up front select what scoping to apply on addresses I tell my peer 956 * Not sure what to do with these right now, we will need to come up 957 * with a way to set them. We may need to pass them through from the 958 * caller in the sctp_aloc_assoc() function. 959 */ 960 int i; 961 #if defined(SCTP_DETAILED_STR_STATS) 962 int j; 963 #endif 964 965 asoc = &stcb->asoc; 966 /* init all variables to a known value. */ 967 SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_INUSE); 968 asoc->max_burst = inp->sctp_ep.max_burst; 969 asoc->fr_max_burst = inp->sctp_ep.fr_max_burst; 970 asoc->heart_beat_delay = TICKS_TO_MSEC(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT]); 971 asoc->cookie_life = inp->sctp_ep.def_cookie_life; 972 asoc->sctp_cmt_on_off = inp->sctp_cmt_on_off; 973 asoc->ecn_supported = inp->ecn_supported; 974 asoc->prsctp_supported = inp->prsctp_supported; 975 asoc->idata_supported = inp->idata_supported; 976 asoc->auth_supported = inp->auth_supported; 977 asoc->asconf_supported = inp->asconf_supported; 978 asoc->reconfig_supported = inp->reconfig_supported; 979 asoc->nrsack_supported = inp->nrsack_supported; 980 asoc->pktdrop_supported = inp->pktdrop_supported; 981 asoc->idata_supported = inp->idata_supported; 982 asoc->sctp_cmt_pf = (uint8_t)0; 983 asoc->sctp_frag_point = inp->sctp_frag_point; 984 asoc->sctp_features = inp->sctp_features; 985 asoc->default_dscp = inp->sctp_ep.default_dscp; 986 asoc->max_cwnd = inp->max_cwnd; 987 #ifdef INET6 988 if (inp->sctp_ep.default_flowlabel) { 989 asoc->default_flowlabel = inp->sctp_ep.default_flowlabel; 990 } else { 991 if (inp->ip_inp.inp.inp_flags & IN6P_AUTOFLOWLABEL) { 992 asoc->default_flowlabel = sctp_select_initial_TSN(&inp->sctp_ep); 993 asoc->default_flowlabel &= 0x000fffff; 994 asoc->default_flowlabel |= 0x80000000; 995 } else { 996 asoc->default_flowlabel = 0; 997 } 998 } 999 #endif 1000 asoc->sb_send_resv = 0; 1001 if (override_tag) { 1002 asoc->my_vtag = override_tag; 1003 } else { 1004 asoc->my_vtag = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 1); 1005 } 1006 /* Get the nonce tags */ 1007 asoc->my_vtag_nonce = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 0); 1008 asoc->peer_vtag_nonce = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 0); 1009 asoc->vrf_id = vrf_id; 1010 1011 #ifdef SCTP_ASOCLOG_OF_TSNS 1012 asoc->tsn_in_at = 0; 1013 asoc->tsn_out_at = 0; 1014 asoc->tsn_in_wrapped = 0; 1015 asoc->tsn_out_wrapped = 0; 1016 asoc->cumack_log_at = 0; 1017 asoc->cumack_log_atsnt = 0; 1018 #endif 1019 #ifdef SCTP_FS_SPEC_LOG 1020 asoc->fs_index = 0; 1021 #endif 1022 asoc->refcnt = 0; 1023 asoc->assoc_up_sent = 0; 1024 asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number = asoc->sending_seq = 1025 sctp_select_initial_TSN(&inp->sctp_ep); 1026 asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1; 1027 /* we are optimisitic here */ 1028 asoc->peer_supports_nat = 0; 1029 asoc->sent_queue_retran_cnt = 0; 1030 1031 /* for CMT */ 1032 asoc->last_net_cmt_send_started = NULL; 1033 1034 /* This will need to be adjusted */ 1035 asoc->last_acked_seq = asoc->init_seq_number - 1; 1036 asoc->advanced_peer_ack_point = asoc->last_acked_seq; 1037 asoc->asconf_seq_in = asoc->last_acked_seq; 1038 1039 /* here we are different, we hold the next one we expect */ 1040 asoc->str_reset_seq_in = asoc->last_acked_seq + 1; 1041 1042 asoc->initial_init_rto_max = inp->sctp_ep.initial_init_rto_max; 1043 asoc->initial_rto = inp->sctp_ep.initial_rto; 1044 1045 asoc->max_init_times = inp->sctp_ep.max_init_times; 1046 asoc->max_send_times = inp->sctp_ep.max_send_times; 1047 asoc->def_net_failure = inp->sctp_ep.def_net_failure; 1048 asoc->def_net_pf_threshold = inp->sctp_ep.def_net_pf_threshold; 1049 asoc->free_chunk_cnt = 0; 1050 1051 asoc->iam_blocking = 0; 1052 asoc->context = inp->sctp_context; 1053 asoc->local_strreset_support = inp->local_strreset_support; 1054 asoc->def_send = inp->def_send; 1055 asoc->delayed_ack = TICKS_TO_MSEC(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_RECV]); 1056 asoc->sack_freq = inp->sctp_ep.sctp_sack_freq; 1057 asoc->pr_sctp_cnt = 0; 1058 asoc->total_output_queue_size = 0; 1059 1060 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 1061 asoc->scope.ipv6_addr_legal = 1; 1062 if (SCTP_IPV6_V6ONLY(inp) == 0) { 1063 asoc->scope.ipv4_addr_legal = 1; 1064 } else { 1065 asoc->scope.ipv4_addr_legal = 0; 1066 } 1067 } else { 1068 asoc->scope.ipv6_addr_legal = 0; 1069 asoc->scope.ipv4_addr_legal = 1; 1070 } 1071 1072 asoc->my_rwnd = max(SCTP_SB_LIMIT_RCV(inp->sctp_socket), SCTP_MINIMAL_RWND); 1073 asoc->peers_rwnd = SCTP_SB_LIMIT_RCV(inp->sctp_socket); 1074 1075 asoc->smallest_mtu = inp->sctp_frag_point; 1076 asoc->minrto = inp->sctp_ep.sctp_minrto; 1077 asoc->maxrto = inp->sctp_ep.sctp_maxrto; 1078 1079 asoc->stream_locked_on = 0; 1080 asoc->ecn_echo_cnt_onq = 0; 1081 asoc->stream_locked = 0; 1082 1083 asoc->send_sack = 1; 1084 1085 LIST_INIT(&asoc->sctp_restricted_addrs); 1086 1087 TAILQ_INIT(&asoc->nets); 1088 TAILQ_INIT(&asoc->pending_reply_queue); 1089 TAILQ_INIT(&asoc->asconf_ack_sent); 1090 /* Setup to fill the hb random cache at first HB */ 1091 asoc->hb_random_idx = 4; 1092 1093 asoc->sctp_autoclose_ticks = inp->sctp_ep.auto_close_time; 1094 1095 stcb->asoc.congestion_control_module = inp->sctp_ep.sctp_default_cc_module; 1096 stcb->asoc.cc_functions = sctp_cc_functions[inp->sctp_ep.sctp_default_cc_module]; 1097 1098 stcb->asoc.stream_scheduling_module = inp->sctp_ep.sctp_default_ss_module; 1099 stcb->asoc.ss_functions = sctp_ss_functions[inp->sctp_ep.sctp_default_ss_module]; 1100 1101 /* 1102 * Now the stream parameters, here we allocate space for all streams 1103 * that we request by default. 1104 */ 1105 asoc->strm_realoutsize = asoc->streamoutcnt = asoc->pre_open_streams = 1106 o_strms; 1107 SCTP_MALLOC(asoc->strmout, struct sctp_stream_out *, 1108 asoc->streamoutcnt * sizeof(struct sctp_stream_out), 1109 SCTP_M_STRMO); 1110 if (asoc->strmout == NULL) { 1111 /* big trouble no memory */ 1112 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); 1113 return (ENOMEM); 1114 } 1115 for (i = 0; i < asoc->streamoutcnt; i++) { 1116 /* 1117 * inbound side must be set to 0xffff, also NOTE when we get 1118 * the INIT-ACK back (for INIT sender) we MUST reduce the 1119 * count (streamoutcnt) but first check if we sent to any of 1120 * the upper streams that were dropped (if some were). Those 1121 * that were dropped must be notified to the upper layer as 1122 * failed to send. 1123 */ 1124 asoc->strmout[i].next_mid_ordered = 0; 1125 asoc->strmout[i].next_mid_unordered = 0; 1126 TAILQ_INIT(&asoc->strmout[i].outqueue); 1127 asoc->strmout[i].chunks_on_queues = 0; 1128 #if defined(SCTP_DETAILED_STR_STATS) 1129 for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { 1130 asoc->strmout[i].abandoned_sent[j] = 0; 1131 asoc->strmout[i].abandoned_unsent[j] = 0; 1132 } 1133 #else 1134 asoc->strmout[i].abandoned_sent[0] = 0; 1135 asoc->strmout[i].abandoned_unsent[0] = 0; 1136 #endif 1137 asoc->strmout[i].sid = i; 1138 asoc->strmout[i].last_msg_incomplete = 0; 1139 asoc->strmout[i].state = SCTP_STREAM_OPENING; 1140 asoc->ss_functions.sctp_ss_init_stream(stcb, &asoc->strmout[i], NULL); 1141 } 1142 asoc->ss_functions.sctp_ss_init(stcb, asoc, 0); 1143 1144 /* Now the mapping array */ 1145 asoc->mapping_array_size = SCTP_INITIAL_MAPPING_ARRAY; 1146 SCTP_MALLOC(asoc->mapping_array, uint8_t *, asoc->mapping_array_size, 1147 SCTP_M_MAP); 1148 if (asoc->mapping_array == NULL) { 1149 SCTP_FREE(asoc->strmout, SCTP_M_STRMO); 1150 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); 1151 return (ENOMEM); 1152 } 1153 memset(asoc->mapping_array, 0, asoc->mapping_array_size); 1154 SCTP_MALLOC(asoc->nr_mapping_array, uint8_t *, asoc->mapping_array_size, 1155 SCTP_M_MAP); 1156 if (asoc->nr_mapping_array == NULL) { 1157 SCTP_FREE(asoc->strmout, SCTP_M_STRMO); 1158 SCTP_FREE(asoc->mapping_array, SCTP_M_MAP); 1159 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); 1160 return (ENOMEM); 1161 } 1162 memset(asoc->nr_mapping_array, 0, asoc->mapping_array_size); 1163 1164 /* Now the init of the other outqueues */ 1165 TAILQ_INIT(&asoc->free_chunks); 1166 TAILQ_INIT(&asoc->control_send_queue); 1167 TAILQ_INIT(&asoc->asconf_send_queue); 1168 TAILQ_INIT(&asoc->send_queue); 1169 TAILQ_INIT(&asoc->sent_queue); 1170 TAILQ_INIT(&asoc->resetHead); 1171 asoc->max_inbound_streams = inp->sctp_ep.max_open_streams_intome; 1172 TAILQ_INIT(&asoc->asconf_queue); 1173 /* authentication fields */ 1174 asoc->authinfo.random = NULL; 1175 asoc->authinfo.active_keyid = 0; 1176 asoc->authinfo.assoc_key = NULL; 1177 asoc->authinfo.assoc_keyid = 0; 1178 asoc->authinfo.recv_key = NULL; 1179 asoc->authinfo.recv_keyid = 0; 1180 LIST_INIT(&asoc->shared_keys); 1181 asoc->marked_retrans = 0; 1182 asoc->port = inp->sctp_ep.port; 1183 asoc->timoinit = 0; 1184 asoc->timodata = 0; 1185 asoc->timosack = 0; 1186 asoc->timoshutdown = 0; 1187 asoc->timoheartbeat = 0; 1188 asoc->timocookie = 0; 1189 asoc->timoshutdownack = 0; 1190 (void)SCTP_GETTIME_TIMEVAL(&asoc->start_time); 1191 asoc->discontinuity_time = asoc->start_time; 1192 for (i = 0; i < SCTP_PR_SCTP_MAX + 1; i++) { 1193 asoc->abandoned_unsent[i] = 0; 1194 asoc->abandoned_sent[i] = 0; 1195 } 1196 /* 1197 * sa_ignore MEMLEAK {memory is put in the assoc mapping array and 1198 * freed later when the association is freed. 1199 */ 1200 return (0); 1201 } 1202 1203 void 1204 sctp_print_mapping_array(struct sctp_association *asoc) 1205 { 1206 unsigned int i, limit; 1207 1208 SCTP_PRINTF("Mapping array size: %d, baseTSN: %8.8x, cumAck: %8.8x, highestTSN: (%8.8x, %8.8x).\n", 1209 asoc->mapping_array_size, 1210 asoc->mapping_array_base_tsn, 1211 asoc->cumulative_tsn, 1212 asoc->highest_tsn_inside_map, 1213 asoc->highest_tsn_inside_nr_map); 1214 for (limit = asoc->mapping_array_size; limit > 1; limit--) { 1215 if (asoc->mapping_array[limit - 1] != 0) { 1216 break; 1217 } 1218 } 1219 SCTP_PRINTF("Renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); 1220 for (i = 0; i < limit; i++) { 1221 SCTP_PRINTF("%2.2x%c", asoc->mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); 1222 } 1223 if (limit % 16) 1224 SCTP_PRINTF("\n"); 1225 for (limit = asoc->mapping_array_size; limit > 1; limit--) { 1226 if (asoc->nr_mapping_array[limit - 1]) { 1227 break; 1228 } 1229 } 1230 SCTP_PRINTF("Non renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit); 1231 for (i = 0; i < limit; i++) { 1232 SCTP_PRINTF("%2.2x%c", asoc->nr_mapping_array[i], ((i + 1) % 16) ? ' ' : '\n'); 1233 } 1234 if (limit % 16) 1235 SCTP_PRINTF("\n"); 1236 } 1237 1238 int 1239 sctp_expand_mapping_array(struct sctp_association *asoc, uint32_t needed) 1240 { 1241 /* mapping array needs to grow */ 1242 uint8_t *new_array1, *new_array2; 1243 uint32_t new_size; 1244 1245 new_size = asoc->mapping_array_size + ((needed + 7) / 8 + SCTP_MAPPING_ARRAY_INCR); 1246 SCTP_MALLOC(new_array1, uint8_t *, new_size, SCTP_M_MAP); 1247 SCTP_MALLOC(new_array2, uint8_t *, new_size, SCTP_M_MAP); 1248 if ((new_array1 == NULL) || (new_array2 == NULL)) { 1249 /* can't get more, forget it */ 1250 SCTP_PRINTF("No memory for expansion of SCTP mapping array %d\n", new_size); 1251 if (new_array1) { 1252 SCTP_FREE(new_array1, SCTP_M_MAP); 1253 } 1254 if (new_array2) { 1255 SCTP_FREE(new_array2, SCTP_M_MAP); 1256 } 1257 return (-1); 1258 } 1259 memset(new_array1, 0, new_size); 1260 memset(new_array2, 0, new_size); 1261 memcpy(new_array1, asoc->mapping_array, asoc->mapping_array_size); 1262 memcpy(new_array2, asoc->nr_mapping_array, asoc->mapping_array_size); 1263 SCTP_FREE(asoc->mapping_array, SCTP_M_MAP); 1264 SCTP_FREE(asoc->nr_mapping_array, SCTP_M_MAP); 1265 asoc->mapping_array = new_array1; 1266 asoc->nr_mapping_array = new_array2; 1267 asoc->mapping_array_size = new_size; 1268 return (0); 1269 } 1270 1271 1272 static void 1273 sctp_iterator_work(struct sctp_iterator *it) 1274 { 1275 int iteration_count = 0; 1276 int inp_skip = 0; 1277 int first_in = 1; 1278 struct sctp_inpcb *tinp; 1279 1280 SCTP_INP_INFO_RLOCK(); 1281 SCTP_ITERATOR_LOCK(); 1282 sctp_it_ctl.cur_it = it; 1283 if (it->inp) { 1284 SCTP_INP_RLOCK(it->inp); 1285 SCTP_INP_DECR_REF(it->inp); 1286 } 1287 if (it->inp == NULL) { 1288 /* iterator is complete */ 1289 done_with_iterator: 1290 sctp_it_ctl.cur_it = NULL; 1291 SCTP_ITERATOR_UNLOCK(); 1292 SCTP_INP_INFO_RUNLOCK(); 1293 if (it->function_atend != NULL) { 1294 (*it->function_atend) (it->pointer, it->val); 1295 } 1296 SCTP_FREE(it, SCTP_M_ITER); 1297 return; 1298 } 1299 select_a_new_ep: 1300 if (first_in) { 1301 first_in = 0; 1302 } else { 1303 SCTP_INP_RLOCK(it->inp); 1304 } 1305 while (((it->pcb_flags) && 1306 ((it->inp->sctp_flags & it->pcb_flags) != it->pcb_flags)) || 1307 ((it->pcb_features) && 1308 ((it->inp->sctp_features & it->pcb_features) != it->pcb_features))) { 1309 /* endpoint flags or features don't match, so keep looking */ 1310 if (it->iterator_flags & SCTP_ITERATOR_DO_SINGLE_INP) { 1311 SCTP_INP_RUNLOCK(it->inp); 1312 goto done_with_iterator; 1313 } 1314 tinp = it->inp; 1315 it->inp = LIST_NEXT(it->inp, sctp_list); 1316 SCTP_INP_RUNLOCK(tinp); 1317 if (it->inp == NULL) { 1318 goto done_with_iterator; 1319 } 1320 SCTP_INP_RLOCK(it->inp); 1321 } 1322 /* now go through each assoc which is in the desired state */ 1323 if (it->done_current_ep == 0) { 1324 if (it->function_inp != NULL) 1325 inp_skip = (*it->function_inp) (it->inp, it->pointer, it->val); 1326 it->done_current_ep = 1; 1327 } 1328 if (it->stcb == NULL) { 1329 /* run the per instance function */ 1330 it->stcb = LIST_FIRST(&it->inp->sctp_asoc_list); 1331 } 1332 if ((inp_skip) || it->stcb == NULL) { 1333 if (it->function_inp_end != NULL) { 1334 inp_skip = (*it->function_inp_end) (it->inp, 1335 it->pointer, 1336 it->val); 1337 } 1338 SCTP_INP_RUNLOCK(it->inp); 1339 goto no_stcb; 1340 } 1341 while (it->stcb) { 1342 SCTP_TCB_LOCK(it->stcb); 1343 if (it->asoc_state && ((it->stcb->asoc.state & it->asoc_state) != it->asoc_state)) { 1344 /* not in the right state... keep looking */ 1345 SCTP_TCB_UNLOCK(it->stcb); 1346 goto next_assoc; 1347 } 1348 /* see if we have limited out the iterator loop */ 1349 iteration_count++; 1350 if (iteration_count > SCTP_ITERATOR_MAX_AT_ONCE) { 1351 /* Pause to let others grab the lock */ 1352 atomic_add_int(&it->stcb->asoc.refcnt, 1); 1353 SCTP_TCB_UNLOCK(it->stcb); 1354 SCTP_INP_INCR_REF(it->inp); 1355 SCTP_INP_RUNLOCK(it->inp); 1356 SCTP_ITERATOR_UNLOCK(); 1357 SCTP_INP_INFO_RUNLOCK(); 1358 SCTP_INP_INFO_RLOCK(); 1359 SCTP_ITERATOR_LOCK(); 1360 if (sctp_it_ctl.iterator_flags) { 1361 /* We won't be staying here */ 1362 SCTP_INP_DECR_REF(it->inp); 1363 atomic_add_int(&it->stcb->asoc.refcnt, -1); 1364 if (sctp_it_ctl.iterator_flags & 1365 SCTP_ITERATOR_STOP_CUR_IT) { 1366 sctp_it_ctl.iterator_flags &= ~SCTP_ITERATOR_STOP_CUR_IT; 1367 goto done_with_iterator; 1368 } 1369 if (sctp_it_ctl.iterator_flags & 1370 SCTP_ITERATOR_STOP_CUR_INP) { 1371 sctp_it_ctl.iterator_flags &= ~SCTP_ITERATOR_STOP_CUR_INP; 1372 goto no_stcb; 1373 } 1374 /* If we reach here huh? */ 1375 SCTP_PRINTF("Unknown it ctl flag %x\n", 1376 sctp_it_ctl.iterator_flags); 1377 sctp_it_ctl.iterator_flags = 0; 1378 } 1379 SCTP_INP_RLOCK(it->inp); 1380 SCTP_INP_DECR_REF(it->inp); 1381 SCTP_TCB_LOCK(it->stcb); 1382 atomic_add_int(&it->stcb->asoc.refcnt, -1); 1383 iteration_count = 0; 1384 } 1385 /* run function on this one */ 1386 (*it->function_assoc) (it->inp, it->stcb, it->pointer, it->val); 1387 1388 /* 1389 * we lie here, it really needs to have its own type but 1390 * first I must verify that this won't effect things :-0 1391 */ 1392 if (it->no_chunk_output == 0) 1393 sctp_chunk_output(it->inp, it->stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); 1394 1395 SCTP_TCB_UNLOCK(it->stcb); 1396 next_assoc: 1397 it->stcb = LIST_NEXT(it->stcb, sctp_tcblist); 1398 if (it->stcb == NULL) { 1399 /* Run last function */ 1400 if (it->function_inp_end != NULL) { 1401 inp_skip = (*it->function_inp_end) (it->inp, 1402 it->pointer, 1403 it->val); 1404 } 1405 } 1406 } 1407 SCTP_INP_RUNLOCK(it->inp); 1408 no_stcb: 1409 /* done with all assocs on this endpoint, move on to next endpoint */ 1410 it->done_current_ep = 0; 1411 if (it->iterator_flags & SCTP_ITERATOR_DO_SINGLE_INP) { 1412 it->inp = NULL; 1413 } else { 1414 it->inp = LIST_NEXT(it->inp, sctp_list); 1415 } 1416 if (it->inp == NULL) { 1417 goto done_with_iterator; 1418 } 1419 goto select_a_new_ep; 1420 } 1421 1422 void 1423 sctp_iterator_worker(void) 1424 { 1425 struct sctp_iterator *it, *nit; 1426 1427 /* This function is called with the WQ lock in place */ 1428 1429 sctp_it_ctl.iterator_running = 1; 1430 TAILQ_FOREACH_SAFE(it, &sctp_it_ctl.iteratorhead, sctp_nxt_itr, nit) { 1431 /* now lets work on this one */ 1432 TAILQ_REMOVE(&sctp_it_ctl.iteratorhead, it, sctp_nxt_itr); 1433 SCTP_IPI_ITERATOR_WQ_UNLOCK(); 1434 CURVNET_SET(it->vn); 1435 sctp_iterator_work(it); 1436 CURVNET_RESTORE(); 1437 SCTP_IPI_ITERATOR_WQ_LOCK(); 1438 /* sa_ignore FREED_MEMORY */ 1439 } 1440 sctp_it_ctl.iterator_running = 0; 1441 return; 1442 } 1443 1444 1445 static void 1446 sctp_handle_addr_wq(void) 1447 { 1448 /* deal with the ADDR wq from the rtsock calls */ 1449 struct sctp_laddr *wi, *nwi; 1450 struct sctp_asconf_iterator *asc; 1451 1452 SCTP_MALLOC(asc, struct sctp_asconf_iterator *, 1453 sizeof(struct sctp_asconf_iterator), SCTP_M_ASC_IT); 1454 if (asc == NULL) { 1455 /* Try later, no memory */ 1456 sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ, 1457 (struct sctp_inpcb *)NULL, 1458 (struct sctp_tcb *)NULL, 1459 (struct sctp_nets *)NULL); 1460 return; 1461 } 1462 LIST_INIT(&asc->list_of_work); 1463 asc->cnt = 0; 1464 1465 SCTP_WQ_ADDR_LOCK(); 1466 LIST_FOREACH_SAFE(wi, &SCTP_BASE_INFO(addr_wq), sctp_nxt_addr, nwi) { 1467 LIST_REMOVE(wi, sctp_nxt_addr); 1468 LIST_INSERT_HEAD(&asc->list_of_work, wi, sctp_nxt_addr); 1469 asc->cnt++; 1470 } 1471 SCTP_WQ_ADDR_UNLOCK(); 1472 1473 if (asc->cnt == 0) { 1474 SCTP_FREE(asc, SCTP_M_ASC_IT); 1475 } else { 1476 int ret; 1477 1478 ret = sctp_initiate_iterator(sctp_asconf_iterator_ep, 1479 sctp_asconf_iterator_stcb, 1480 NULL, /* No ep end for boundall */ 1481 SCTP_PCB_FLAGS_BOUNDALL, 1482 SCTP_PCB_ANY_FEATURES, 1483 SCTP_ASOC_ANY_STATE, 1484 (void *)asc, 0, 1485 sctp_asconf_iterator_end, NULL, 0); 1486 if (ret) { 1487 SCTP_PRINTF("Failed to initiate iterator for handle_addr_wq\n"); 1488 /* 1489 * Freeing if we are stopping or put back on the 1490 * addr_wq. 1491 */ 1492 if (SCTP_BASE_VAR(sctp_pcb_initialized) == 0) { 1493 sctp_asconf_iterator_end(asc, 0); 1494 } else { 1495 SCTP_WQ_ADDR_LOCK(); 1496 LIST_FOREACH(wi, &asc->list_of_work, sctp_nxt_addr) { 1497 LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr); 1498 } 1499 SCTP_WQ_ADDR_UNLOCK(); 1500 SCTP_FREE(asc, SCTP_M_ASC_IT); 1501 } 1502 } 1503 } 1504 } 1505 1506 void 1507 sctp_timeout_handler(void *t) 1508 { 1509 struct sctp_inpcb *inp; 1510 struct sctp_tcb *stcb; 1511 struct sctp_nets *net; 1512 struct sctp_timer *tmr; 1513 struct mbuf *op_err; 1514 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 1515 struct socket *so; 1516 #endif 1517 int did_output; 1518 int type; 1519 1520 tmr = (struct sctp_timer *)t; 1521 inp = (struct sctp_inpcb *)tmr->ep; 1522 stcb = (struct sctp_tcb *)tmr->tcb; 1523 net = (struct sctp_nets *)tmr->net; 1524 CURVNET_SET((struct vnet *)tmr->vnet); 1525 did_output = 1; 1526 1527 #ifdef SCTP_AUDITING_ENABLED 1528 sctp_audit_log(0xF0, (uint8_t)tmr->type); 1529 sctp_auditing(3, inp, stcb, net); 1530 #endif 1531 1532 /* sanity checks... */ 1533 if (tmr->self != (void *)tmr) { 1534 /* 1535 * SCTP_PRINTF("Stale SCTP timer fired (%p), ignoring...\n", 1536 * (void *)tmr); 1537 */ 1538 CURVNET_RESTORE(); 1539 return; 1540 } 1541 tmr->stopped_from = 0xa001; 1542 if (!SCTP_IS_TIMER_TYPE_VALID(tmr->type)) { 1543 /* 1544 * SCTP_PRINTF("SCTP timer fired with invalid type: 0x%x\n", 1545 * tmr->type); 1546 */ 1547 CURVNET_RESTORE(); 1548 return; 1549 } 1550 tmr->stopped_from = 0xa002; 1551 if ((tmr->type != SCTP_TIMER_TYPE_ADDR_WQ) && (inp == NULL)) { 1552 CURVNET_RESTORE(); 1553 return; 1554 } 1555 /* if this is an iterator timeout, get the struct and clear inp */ 1556 tmr->stopped_from = 0xa003; 1557 if (inp) { 1558 SCTP_INP_INCR_REF(inp); 1559 if ((inp->sctp_socket == NULL) && 1560 ((tmr->type != SCTP_TIMER_TYPE_INPKILL) && 1561 (tmr->type != SCTP_TIMER_TYPE_INIT) && 1562 (tmr->type != SCTP_TIMER_TYPE_SEND) && 1563 (tmr->type != SCTP_TIMER_TYPE_RECV) && 1564 (tmr->type != SCTP_TIMER_TYPE_HEARTBEAT) && 1565 (tmr->type != SCTP_TIMER_TYPE_SHUTDOWN) && 1566 (tmr->type != SCTP_TIMER_TYPE_SHUTDOWNACK) && 1567 (tmr->type != SCTP_TIMER_TYPE_SHUTDOWNGUARD) && 1568 (tmr->type != SCTP_TIMER_TYPE_ASOCKILL)) 1569 ) { 1570 SCTP_INP_DECR_REF(inp); 1571 CURVNET_RESTORE(); 1572 return; 1573 } 1574 } 1575 tmr->stopped_from = 0xa004; 1576 if (stcb) { 1577 atomic_add_int(&stcb->asoc.refcnt, 1); 1578 if (stcb->asoc.state == 0) { 1579 atomic_add_int(&stcb->asoc.refcnt, -1); 1580 if (inp) { 1581 SCTP_INP_DECR_REF(inp); 1582 } 1583 CURVNET_RESTORE(); 1584 return; 1585 } 1586 } 1587 type = tmr->type; 1588 tmr->stopped_from = 0xa005; 1589 SCTPDBG(SCTP_DEBUG_TIMER1, "Timer type %d goes off\n", type); 1590 if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) { 1591 if (inp) { 1592 SCTP_INP_DECR_REF(inp); 1593 } 1594 if (stcb) { 1595 atomic_add_int(&stcb->asoc.refcnt, -1); 1596 } 1597 CURVNET_RESTORE(); 1598 return; 1599 } 1600 tmr->stopped_from = 0xa006; 1601 1602 if (stcb) { 1603 SCTP_TCB_LOCK(stcb); 1604 atomic_add_int(&stcb->asoc.refcnt, -1); 1605 if ((type != SCTP_TIMER_TYPE_ASOCKILL) && 1606 ((stcb->asoc.state == 0) || 1607 (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED))) { 1608 SCTP_TCB_UNLOCK(stcb); 1609 if (inp) { 1610 SCTP_INP_DECR_REF(inp); 1611 } 1612 CURVNET_RESTORE(); 1613 return; 1614 } 1615 } 1616 /* record in stopped what t-o occurred */ 1617 tmr->stopped_from = type; 1618 1619 /* mark as being serviced now */ 1620 if (SCTP_OS_TIMER_PENDING(&tmr->timer)) { 1621 /* 1622 * Callout has been rescheduled. 1623 */ 1624 goto get_out; 1625 } 1626 if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) { 1627 /* 1628 * Not active, so no action. 1629 */ 1630 goto get_out; 1631 } 1632 SCTP_OS_TIMER_DEACTIVATE(&tmr->timer); 1633 1634 /* call the handler for the appropriate timer type */ 1635 switch (type) { 1636 case SCTP_TIMER_TYPE_ZERO_COPY: 1637 if (inp == NULL) { 1638 break; 1639 } 1640 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { 1641 SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket); 1642 } 1643 break; 1644 case SCTP_TIMER_TYPE_ZCOPY_SENDQ: 1645 if (inp == NULL) { 1646 break; 1647 } 1648 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { 1649 SCTP_ZERO_COPY_SENDQ_EVENT(inp, inp->sctp_socket); 1650 } 1651 break; 1652 case SCTP_TIMER_TYPE_ADDR_WQ: 1653 sctp_handle_addr_wq(); 1654 break; 1655 case SCTP_TIMER_TYPE_SEND: 1656 if ((stcb == NULL) || (inp == NULL)) { 1657 break; 1658 } 1659 SCTP_STAT_INCR(sctps_timodata); 1660 stcb->asoc.timodata++; 1661 stcb->asoc.num_send_timers_up--; 1662 if (stcb->asoc.num_send_timers_up < 0) { 1663 stcb->asoc.num_send_timers_up = 0; 1664 } 1665 SCTP_TCB_LOCK_ASSERT(stcb); 1666 if (sctp_t3rxt_timer(inp, stcb, net)) { 1667 /* no need to unlock on tcb its gone */ 1668 1669 goto out_decr; 1670 } 1671 SCTP_TCB_LOCK_ASSERT(stcb); 1672 #ifdef SCTP_AUDITING_ENABLED 1673 sctp_auditing(4, inp, stcb, net); 1674 #endif 1675 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); 1676 if ((stcb->asoc.num_send_timers_up == 0) && 1677 (stcb->asoc.sent_queue_cnt > 0)) { 1678 struct sctp_tmit_chunk *chk; 1679 1680 /* 1681 * safeguard. If there on some on the sent queue 1682 * somewhere but no timers running something is 1683 * wrong... so we start a timer on the first chunk 1684 * on the send queue on whatever net it is sent to. 1685 */ 1686 chk = TAILQ_FIRST(&stcb->asoc.sent_queue); 1687 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, 1688 chk->whoTo); 1689 } 1690 break; 1691 case SCTP_TIMER_TYPE_INIT: 1692 if ((stcb == NULL) || (inp == NULL)) { 1693 break; 1694 } 1695 SCTP_STAT_INCR(sctps_timoinit); 1696 stcb->asoc.timoinit++; 1697 if (sctp_t1init_timer(inp, stcb, net)) { 1698 /* no need to unlock on tcb its gone */ 1699 goto out_decr; 1700 } 1701 /* We do output but not here */ 1702 did_output = 0; 1703 break; 1704 case SCTP_TIMER_TYPE_RECV: 1705 if ((stcb == NULL) || (inp == NULL)) { 1706 break; 1707 } 1708 SCTP_STAT_INCR(sctps_timosack); 1709 stcb->asoc.timosack++; 1710 sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); 1711 #ifdef SCTP_AUDITING_ENABLED 1712 sctp_auditing(4, inp, stcb, net); 1713 #endif 1714 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SACK_TMR, SCTP_SO_NOT_LOCKED); 1715 break; 1716 case SCTP_TIMER_TYPE_SHUTDOWN: 1717 if ((stcb == NULL) || (inp == NULL)) { 1718 break; 1719 } 1720 if (sctp_shutdown_timer(inp, stcb, net)) { 1721 /* no need to unlock on tcb its gone */ 1722 goto out_decr; 1723 } 1724 SCTP_STAT_INCR(sctps_timoshutdown); 1725 stcb->asoc.timoshutdown++; 1726 #ifdef SCTP_AUDITING_ENABLED 1727 sctp_auditing(4, inp, stcb, net); 1728 #endif 1729 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_NOT_LOCKED); 1730 break; 1731 case SCTP_TIMER_TYPE_HEARTBEAT: 1732 if ((stcb == NULL) || (inp == NULL) || (net == NULL)) { 1733 break; 1734 } 1735 SCTP_STAT_INCR(sctps_timoheartbeat); 1736 stcb->asoc.timoheartbeat++; 1737 if (sctp_heartbeat_timer(inp, stcb, net)) { 1738 /* no need to unlock on tcb its gone */ 1739 goto out_decr; 1740 } 1741 #ifdef SCTP_AUDITING_ENABLED 1742 sctp_auditing(4, inp, stcb, net); 1743 #endif 1744 if (!(net->dest_state & SCTP_ADDR_NOHB)) { 1745 sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); 1746 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_HB_TMR, SCTP_SO_NOT_LOCKED); 1747 } 1748 break; 1749 case SCTP_TIMER_TYPE_COOKIE: 1750 if ((stcb == NULL) || (inp == NULL)) { 1751 break; 1752 } 1753 if (sctp_cookie_timer(inp, stcb, net)) { 1754 /* no need to unlock on tcb its gone */ 1755 goto out_decr; 1756 } 1757 SCTP_STAT_INCR(sctps_timocookie); 1758 stcb->asoc.timocookie++; 1759 #ifdef SCTP_AUDITING_ENABLED 1760 sctp_auditing(4, inp, stcb, net); 1761 #endif 1762 /* 1763 * We consider T3 and Cookie timer pretty much the same with 1764 * respect to where from in chunk_output. 1765 */ 1766 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); 1767 break; 1768 case SCTP_TIMER_TYPE_NEWCOOKIE: 1769 { 1770 struct timeval tv; 1771 int i, secret; 1772 1773 if (inp == NULL) { 1774 break; 1775 } 1776 SCTP_STAT_INCR(sctps_timosecret); 1777 (void)SCTP_GETTIME_TIMEVAL(&tv); 1778 SCTP_INP_WLOCK(inp); 1779 inp->sctp_ep.time_of_secret_change = tv.tv_sec; 1780 inp->sctp_ep.last_secret_number = 1781 inp->sctp_ep.current_secret_number; 1782 inp->sctp_ep.current_secret_number++; 1783 if (inp->sctp_ep.current_secret_number >= 1784 SCTP_HOW_MANY_SECRETS) { 1785 inp->sctp_ep.current_secret_number = 0; 1786 } 1787 secret = (int)inp->sctp_ep.current_secret_number; 1788 for (i = 0; i < SCTP_NUMBER_OF_SECRETS; i++) { 1789 inp->sctp_ep.secret_key[secret][i] = 1790 sctp_select_initial_TSN(&inp->sctp_ep); 1791 } 1792 SCTP_INP_WUNLOCK(inp); 1793 sctp_timer_start(SCTP_TIMER_TYPE_NEWCOOKIE, inp, stcb, net); 1794 } 1795 did_output = 0; 1796 break; 1797 case SCTP_TIMER_TYPE_PATHMTURAISE: 1798 if ((stcb == NULL) || (inp == NULL)) { 1799 break; 1800 } 1801 SCTP_STAT_INCR(sctps_timopathmtu); 1802 sctp_pathmtu_timer(inp, stcb, net); 1803 did_output = 0; 1804 break; 1805 case SCTP_TIMER_TYPE_SHUTDOWNACK: 1806 if ((stcb == NULL) || (inp == NULL)) { 1807 break; 1808 } 1809 if (sctp_shutdownack_timer(inp, stcb, net)) { 1810 /* no need to unlock on tcb its gone */ 1811 goto out_decr; 1812 } 1813 SCTP_STAT_INCR(sctps_timoshutdownack); 1814 stcb->asoc.timoshutdownack++; 1815 #ifdef SCTP_AUDITING_ENABLED 1816 sctp_auditing(4, inp, stcb, net); 1817 #endif 1818 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_ACK_TMR, SCTP_SO_NOT_LOCKED); 1819 break; 1820 case SCTP_TIMER_TYPE_SHUTDOWNGUARD: 1821 if ((stcb == NULL) || (inp == NULL)) { 1822 break; 1823 } 1824 SCTP_STAT_INCR(sctps_timoshutdownguard); 1825 op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), 1826 "Shutdown guard timer expired"); 1827 sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); 1828 /* no need to unlock on tcb its gone */ 1829 goto out_decr; 1830 1831 case SCTP_TIMER_TYPE_STRRESET: 1832 if ((stcb == NULL) || (inp == NULL)) { 1833 break; 1834 } 1835 if (sctp_strreset_timer(inp, stcb, net)) { 1836 /* no need to unlock on tcb its gone */ 1837 goto out_decr; 1838 } 1839 SCTP_STAT_INCR(sctps_timostrmrst); 1840 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_STRRST_TMR, SCTP_SO_NOT_LOCKED); 1841 break; 1842 case SCTP_TIMER_TYPE_ASCONF: 1843 if ((stcb == NULL) || (inp == NULL)) { 1844 break; 1845 } 1846 if (sctp_asconf_timer(inp, stcb, net)) { 1847 /* no need to unlock on tcb its gone */ 1848 goto out_decr; 1849 } 1850 SCTP_STAT_INCR(sctps_timoasconf); 1851 #ifdef SCTP_AUDITING_ENABLED 1852 sctp_auditing(4, inp, stcb, net); 1853 #endif 1854 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_ASCONF_TMR, SCTP_SO_NOT_LOCKED); 1855 break; 1856 case SCTP_TIMER_TYPE_PRIM_DELETED: 1857 if ((stcb == NULL) || (inp == NULL)) { 1858 break; 1859 } 1860 sctp_delete_prim_timer(inp, stcb, net); 1861 SCTP_STAT_INCR(sctps_timodelprim); 1862 break; 1863 1864 case SCTP_TIMER_TYPE_AUTOCLOSE: 1865 if ((stcb == NULL) || (inp == NULL)) { 1866 break; 1867 } 1868 SCTP_STAT_INCR(sctps_timoautoclose); 1869 sctp_autoclose_timer(inp, stcb, net); 1870 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_AUTOCLOSE_TMR, SCTP_SO_NOT_LOCKED); 1871 did_output = 0; 1872 break; 1873 case SCTP_TIMER_TYPE_ASOCKILL: 1874 if ((stcb == NULL) || (inp == NULL)) { 1875 break; 1876 } 1877 SCTP_STAT_INCR(sctps_timoassockill); 1878 /* Can we free it yet? */ 1879 SCTP_INP_DECR_REF(inp); 1880 sctp_timer_stop(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL, 1881 SCTP_FROM_SCTPUTIL + SCTP_LOC_1); 1882 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 1883 so = SCTP_INP_SO(inp); 1884 atomic_add_int(&stcb->asoc.refcnt, 1); 1885 SCTP_TCB_UNLOCK(stcb); 1886 SCTP_SOCKET_LOCK(so, 1); 1887 SCTP_TCB_LOCK(stcb); 1888 atomic_subtract_int(&stcb->asoc.refcnt, 1); 1889 #endif 1890 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 1891 SCTP_FROM_SCTPUTIL + SCTP_LOC_2); 1892 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 1893 SCTP_SOCKET_UNLOCK(so, 1); 1894 #endif 1895 /* 1896 * free asoc, always unlocks (or destroy's) so prevent 1897 * duplicate unlock or unlock of a free mtx :-0 1898 */ 1899 stcb = NULL; 1900 goto out_no_decr; 1901 case SCTP_TIMER_TYPE_INPKILL: 1902 SCTP_STAT_INCR(sctps_timoinpkill); 1903 if (inp == NULL) { 1904 break; 1905 } 1906 /* 1907 * special case, take away our increment since WE are the 1908 * killer 1909 */ 1910 SCTP_INP_DECR_REF(inp); 1911 sctp_timer_stop(SCTP_TIMER_TYPE_INPKILL, inp, NULL, NULL, 1912 SCTP_FROM_SCTPUTIL + SCTP_LOC_3); 1913 sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, 1914 SCTP_CALLED_FROM_INPKILL_TIMER); 1915 inp = NULL; 1916 goto out_no_decr; 1917 default: 1918 SCTPDBG(SCTP_DEBUG_TIMER1, "sctp_timeout_handler:unknown timer %d\n", 1919 type); 1920 break; 1921 } 1922 #ifdef SCTP_AUDITING_ENABLED 1923 sctp_audit_log(0xF1, (uint8_t)type); 1924 if (inp) 1925 sctp_auditing(5, inp, stcb, net); 1926 #endif 1927 if ((did_output) && stcb) { 1928 /* 1929 * Now we need to clean up the control chunk chain if an 1930 * ECNE is on it. It must be marked as UNSENT again so next 1931 * call will continue to send it until such time that we get 1932 * a CWR, to remove it. It is, however, less likely that we 1933 * will find a ecn echo on the chain though. 1934 */ 1935 sctp_fix_ecn_echo(&stcb->asoc); 1936 } 1937 get_out: 1938 if (stcb) { 1939 SCTP_TCB_UNLOCK(stcb); 1940 } 1941 out_decr: 1942 if (inp) { 1943 SCTP_INP_DECR_REF(inp); 1944 } 1945 out_no_decr: 1946 SCTPDBG(SCTP_DEBUG_TIMER1, "Timer now complete (type = %d)\n", type); 1947 CURVNET_RESTORE(); 1948 } 1949 1950 void 1951 sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, 1952 struct sctp_nets *net) 1953 { 1954 uint32_t to_ticks; 1955 struct sctp_timer *tmr; 1956 1957 if ((t_type != SCTP_TIMER_TYPE_ADDR_WQ) && (inp == NULL)) 1958 return; 1959 1960 tmr = NULL; 1961 if (stcb) { 1962 SCTP_TCB_LOCK_ASSERT(stcb); 1963 } 1964 switch (t_type) { 1965 case SCTP_TIMER_TYPE_ZERO_COPY: 1966 tmr = &inp->sctp_ep.zero_copy_timer; 1967 to_ticks = SCTP_ZERO_COPY_TICK_DELAY; 1968 break; 1969 case SCTP_TIMER_TYPE_ZCOPY_SENDQ: 1970 tmr = &inp->sctp_ep.zero_copy_sendq_timer; 1971 to_ticks = SCTP_ZERO_COPY_SENDQ_TICK_DELAY; 1972 break; 1973 case SCTP_TIMER_TYPE_ADDR_WQ: 1974 /* Only 1 tick away :-) */ 1975 tmr = &SCTP_BASE_INFO(addr_wq_timer); 1976 to_ticks = SCTP_ADDRESS_TICK_DELAY; 1977 break; 1978 case SCTP_TIMER_TYPE_SEND: 1979 /* Here we use the RTO timer */ 1980 { 1981 int rto_val; 1982 1983 if ((stcb == NULL) || (net == NULL)) { 1984 return; 1985 } 1986 tmr = &net->rxt_timer; 1987 if (net->RTO == 0) { 1988 rto_val = stcb->asoc.initial_rto; 1989 } else { 1990 rto_val = net->RTO; 1991 } 1992 to_ticks = MSEC_TO_TICKS(rto_val); 1993 } 1994 break; 1995 case SCTP_TIMER_TYPE_INIT: 1996 /* 1997 * Here we use the INIT timer default usually about 1 1998 * minute. 1999 */ 2000 if ((stcb == NULL) || (net == NULL)) { 2001 return; 2002 } 2003 tmr = &net->rxt_timer; 2004 if (net->RTO == 0) { 2005 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2006 } else { 2007 to_ticks = MSEC_TO_TICKS(net->RTO); 2008 } 2009 break; 2010 case SCTP_TIMER_TYPE_RECV: 2011 /* 2012 * Here we use the Delayed-Ack timer value from the inp 2013 * ususually about 200ms. 2014 */ 2015 if (stcb == NULL) { 2016 return; 2017 } 2018 tmr = &stcb->asoc.dack_timer; 2019 to_ticks = MSEC_TO_TICKS(stcb->asoc.delayed_ack); 2020 break; 2021 case SCTP_TIMER_TYPE_SHUTDOWN: 2022 /* Here we use the RTO of the destination. */ 2023 if ((stcb == NULL) || (net == NULL)) { 2024 return; 2025 } 2026 if (net->RTO == 0) { 2027 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2028 } else { 2029 to_ticks = MSEC_TO_TICKS(net->RTO); 2030 } 2031 tmr = &net->rxt_timer; 2032 break; 2033 case SCTP_TIMER_TYPE_HEARTBEAT: 2034 /* 2035 * the net is used here so that we can add in the RTO. Even 2036 * though we use a different timer. We also add the HB timer 2037 * PLUS a random jitter. 2038 */ 2039 if ((stcb == NULL) || (net == NULL)) { 2040 return; 2041 } else { 2042 uint32_t rndval; 2043 uint32_t jitter; 2044 2045 if ((net->dest_state & SCTP_ADDR_NOHB) && 2046 !(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { 2047 return; 2048 } 2049 if (net->RTO == 0) { 2050 to_ticks = stcb->asoc.initial_rto; 2051 } else { 2052 to_ticks = net->RTO; 2053 } 2054 rndval = sctp_select_initial_TSN(&inp->sctp_ep); 2055 jitter = rndval % to_ticks; 2056 if (jitter >= (to_ticks >> 1)) { 2057 to_ticks = to_ticks + (jitter - (to_ticks >> 1)); 2058 } else { 2059 to_ticks = to_ticks - jitter; 2060 } 2061 if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) && 2062 !(net->dest_state & SCTP_ADDR_PF)) { 2063 to_ticks += net->heart_beat_delay; 2064 } 2065 /* 2066 * Now we must convert the to_ticks that are now in 2067 * ms to ticks. 2068 */ 2069 to_ticks = MSEC_TO_TICKS(to_ticks); 2070 tmr = &net->hb_timer; 2071 } 2072 break; 2073 case SCTP_TIMER_TYPE_COOKIE: 2074 /* 2075 * Here we can use the RTO timer from the network since one 2076 * RTT was compelete. If a retran happened then we will be 2077 * using the RTO initial value. 2078 */ 2079 if ((stcb == NULL) || (net == NULL)) { 2080 return; 2081 } 2082 if (net->RTO == 0) { 2083 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2084 } else { 2085 to_ticks = MSEC_TO_TICKS(net->RTO); 2086 } 2087 tmr = &net->rxt_timer; 2088 break; 2089 case SCTP_TIMER_TYPE_NEWCOOKIE: 2090 /* 2091 * nothing needed but the endpoint here ususually about 60 2092 * minutes. 2093 */ 2094 tmr = &inp->sctp_ep.signature_change; 2095 to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_SIGNATURE]; 2096 break; 2097 case SCTP_TIMER_TYPE_ASOCKILL: 2098 if (stcb == NULL) { 2099 return; 2100 } 2101 tmr = &stcb->asoc.strreset_timer; 2102 to_ticks = MSEC_TO_TICKS(SCTP_ASOC_KILL_TIMEOUT); 2103 break; 2104 case SCTP_TIMER_TYPE_INPKILL: 2105 /* 2106 * The inp is setup to die. We re-use the signature_chage 2107 * timer since that has stopped and we are in the GONE 2108 * state. 2109 */ 2110 tmr = &inp->sctp_ep.signature_change; 2111 to_ticks = MSEC_TO_TICKS(SCTP_INP_KILL_TIMEOUT); 2112 break; 2113 case SCTP_TIMER_TYPE_PATHMTURAISE: 2114 /* 2115 * Here we use the value found in the EP for PMTU ususually 2116 * about 10 minutes. 2117 */ 2118 if ((stcb == NULL) || (net == NULL)) { 2119 return; 2120 } 2121 if (net->dest_state & SCTP_ADDR_NO_PMTUD) { 2122 return; 2123 } 2124 to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_PMTU]; 2125 tmr = &net->pmtu_timer; 2126 break; 2127 case SCTP_TIMER_TYPE_SHUTDOWNACK: 2128 /* Here we use the RTO of the destination */ 2129 if ((stcb == NULL) || (net == NULL)) { 2130 return; 2131 } 2132 if (net->RTO == 0) { 2133 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2134 } else { 2135 to_ticks = MSEC_TO_TICKS(net->RTO); 2136 } 2137 tmr = &net->rxt_timer; 2138 break; 2139 case SCTP_TIMER_TYPE_SHUTDOWNGUARD: 2140 /* 2141 * Here we use the endpoints shutdown guard timer usually 2142 * about 3 minutes. 2143 */ 2144 if (stcb == NULL) { 2145 return; 2146 } 2147 if (inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_MAXSHUTDOWN] == 0) { 2148 to_ticks = 5 * MSEC_TO_TICKS(stcb->asoc.maxrto); 2149 } else { 2150 to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_MAXSHUTDOWN]; 2151 } 2152 tmr = &stcb->asoc.shut_guard_timer; 2153 break; 2154 case SCTP_TIMER_TYPE_STRRESET: 2155 /* 2156 * Here the timer comes from the stcb but its value is from 2157 * the net's RTO. 2158 */ 2159 if ((stcb == NULL) || (net == NULL)) { 2160 return; 2161 } 2162 if (net->RTO == 0) { 2163 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2164 } else { 2165 to_ticks = MSEC_TO_TICKS(net->RTO); 2166 } 2167 tmr = &stcb->asoc.strreset_timer; 2168 break; 2169 case SCTP_TIMER_TYPE_ASCONF: 2170 /* 2171 * Here the timer comes from the stcb but its value is from 2172 * the net's RTO. 2173 */ 2174 if ((stcb == NULL) || (net == NULL)) { 2175 return; 2176 } 2177 if (net->RTO == 0) { 2178 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2179 } else { 2180 to_ticks = MSEC_TO_TICKS(net->RTO); 2181 } 2182 tmr = &stcb->asoc.asconf_timer; 2183 break; 2184 case SCTP_TIMER_TYPE_PRIM_DELETED: 2185 if ((stcb == NULL) || (net != NULL)) { 2186 return; 2187 } 2188 to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); 2189 tmr = &stcb->asoc.delete_prim_timer; 2190 break; 2191 case SCTP_TIMER_TYPE_AUTOCLOSE: 2192 if (stcb == NULL) { 2193 return; 2194 } 2195 if (stcb->asoc.sctp_autoclose_ticks == 0) { 2196 /* 2197 * Really an error since stcb is NOT set to 2198 * autoclose 2199 */ 2200 return; 2201 } 2202 to_ticks = stcb->asoc.sctp_autoclose_ticks; 2203 tmr = &stcb->asoc.autoclose_timer; 2204 break; 2205 default: 2206 SCTPDBG(SCTP_DEBUG_TIMER1, "%s: Unknown timer type %d\n", 2207 __func__, t_type); 2208 return; 2209 break; 2210 } 2211 if ((to_ticks <= 0) || (tmr == NULL)) { 2212 SCTPDBG(SCTP_DEBUG_TIMER1, "%s: %d:software error to_ticks:%d tmr:%p not set ??\n", 2213 __func__, t_type, to_ticks, (void *)tmr); 2214 return; 2215 } 2216 if (SCTP_OS_TIMER_PENDING(&tmr->timer)) { 2217 /* 2218 * we do NOT allow you to have it already running. if it is 2219 * we leave the current one up unchanged 2220 */ 2221 return; 2222 } 2223 /* At this point we can proceed */ 2224 if (t_type == SCTP_TIMER_TYPE_SEND) { 2225 stcb->asoc.num_send_timers_up++; 2226 } 2227 tmr->stopped_from = 0; 2228 tmr->type = t_type; 2229 tmr->ep = (void *)inp; 2230 tmr->tcb = (void *)stcb; 2231 tmr->net = (void *)net; 2232 tmr->self = (void *)tmr; 2233 tmr->vnet = (void *)curvnet; 2234 tmr->ticks = sctp_get_tick_count(); 2235 (void)SCTP_OS_TIMER_START(&tmr->timer, to_ticks, sctp_timeout_handler, tmr); 2236 return; 2237 } 2238 2239 void 2240 sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, 2241 struct sctp_nets *net, uint32_t from) 2242 { 2243 struct sctp_timer *tmr; 2244 2245 if ((t_type != SCTP_TIMER_TYPE_ADDR_WQ) && 2246 (inp == NULL)) 2247 return; 2248 2249 tmr = NULL; 2250 if (stcb) { 2251 SCTP_TCB_LOCK_ASSERT(stcb); 2252 } 2253 switch (t_type) { 2254 case SCTP_TIMER_TYPE_ZERO_COPY: 2255 tmr = &inp->sctp_ep.zero_copy_timer; 2256 break; 2257 case SCTP_TIMER_TYPE_ZCOPY_SENDQ: 2258 tmr = &inp->sctp_ep.zero_copy_sendq_timer; 2259 break; 2260 case SCTP_TIMER_TYPE_ADDR_WQ: 2261 tmr = &SCTP_BASE_INFO(addr_wq_timer); 2262 break; 2263 case SCTP_TIMER_TYPE_SEND: 2264 if ((stcb == NULL) || (net == NULL)) { 2265 return; 2266 } 2267 tmr = &net->rxt_timer; 2268 break; 2269 case SCTP_TIMER_TYPE_INIT: 2270 if ((stcb == NULL) || (net == NULL)) { 2271 return; 2272 } 2273 tmr = &net->rxt_timer; 2274 break; 2275 case SCTP_TIMER_TYPE_RECV: 2276 if (stcb == NULL) { 2277 return; 2278 } 2279 tmr = &stcb->asoc.dack_timer; 2280 break; 2281 case SCTP_TIMER_TYPE_SHUTDOWN: 2282 if ((stcb == NULL) || (net == NULL)) { 2283 return; 2284 } 2285 tmr = &net->rxt_timer; 2286 break; 2287 case SCTP_TIMER_TYPE_HEARTBEAT: 2288 if ((stcb == NULL) || (net == NULL)) { 2289 return; 2290 } 2291 tmr = &net->hb_timer; 2292 break; 2293 case SCTP_TIMER_TYPE_COOKIE: 2294 if ((stcb == NULL) || (net == NULL)) { 2295 return; 2296 } 2297 tmr = &net->rxt_timer; 2298 break; 2299 case SCTP_TIMER_TYPE_NEWCOOKIE: 2300 /* nothing needed but the endpoint here */ 2301 tmr = &inp->sctp_ep.signature_change; 2302 /* 2303 * We re-use the newcookie timer for the INP kill timer. We 2304 * must assure that we do not kill it by accident. 2305 */ 2306 break; 2307 case SCTP_TIMER_TYPE_ASOCKILL: 2308 /* 2309 * Stop the asoc kill timer. 2310 */ 2311 if (stcb == NULL) { 2312 return; 2313 } 2314 tmr = &stcb->asoc.strreset_timer; 2315 break; 2316 2317 case SCTP_TIMER_TYPE_INPKILL: 2318 /* 2319 * The inp is setup to die. We re-use the signature_chage 2320 * timer since that has stopped and we are in the GONE 2321 * state. 2322 */ 2323 tmr = &inp->sctp_ep.signature_change; 2324 break; 2325 case SCTP_TIMER_TYPE_PATHMTURAISE: 2326 if ((stcb == NULL) || (net == NULL)) { 2327 return; 2328 } 2329 tmr = &net->pmtu_timer; 2330 break; 2331 case SCTP_TIMER_TYPE_SHUTDOWNACK: 2332 if ((stcb == NULL) || (net == NULL)) { 2333 return; 2334 } 2335 tmr = &net->rxt_timer; 2336 break; 2337 case SCTP_TIMER_TYPE_SHUTDOWNGUARD: 2338 if (stcb == NULL) { 2339 return; 2340 } 2341 tmr = &stcb->asoc.shut_guard_timer; 2342 break; 2343 case SCTP_TIMER_TYPE_STRRESET: 2344 if (stcb == NULL) { 2345 return; 2346 } 2347 tmr = &stcb->asoc.strreset_timer; 2348 break; 2349 case SCTP_TIMER_TYPE_ASCONF: 2350 if (stcb == NULL) { 2351 return; 2352 } 2353 tmr = &stcb->asoc.asconf_timer; 2354 break; 2355 case SCTP_TIMER_TYPE_PRIM_DELETED: 2356 if (stcb == NULL) { 2357 return; 2358 } 2359 tmr = &stcb->asoc.delete_prim_timer; 2360 break; 2361 case SCTP_TIMER_TYPE_AUTOCLOSE: 2362 if (stcb == NULL) { 2363 return; 2364 } 2365 tmr = &stcb->asoc.autoclose_timer; 2366 break; 2367 default: 2368 SCTPDBG(SCTP_DEBUG_TIMER1, "%s: Unknown timer type %d\n", 2369 __func__, t_type); 2370 break; 2371 } 2372 if (tmr == NULL) { 2373 return; 2374 } 2375 if ((tmr->type != t_type) && tmr->type) { 2376 /* 2377 * Ok we have a timer that is under joint use. Cookie timer 2378 * per chance with the SEND timer. We therefore are NOT 2379 * running the timer that the caller wants stopped. So just 2380 * return. 2381 */ 2382 return; 2383 } 2384 if ((t_type == SCTP_TIMER_TYPE_SEND) && (stcb != NULL)) { 2385 stcb->asoc.num_send_timers_up--; 2386 if (stcb->asoc.num_send_timers_up < 0) { 2387 stcb->asoc.num_send_timers_up = 0; 2388 } 2389 } 2390 tmr->self = NULL; 2391 tmr->stopped_from = from; 2392 (void)SCTP_OS_TIMER_STOP(&tmr->timer); 2393 return; 2394 } 2395 2396 uint32_t 2397 sctp_calculate_len(struct mbuf *m) 2398 { 2399 uint32_t tlen = 0; 2400 struct mbuf *at; 2401 2402 at = m; 2403 while (at) { 2404 tlen += SCTP_BUF_LEN(at); 2405 at = SCTP_BUF_NEXT(at); 2406 } 2407 return (tlen); 2408 } 2409 2410 void 2411 sctp_mtu_size_reset(struct sctp_inpcb *inp, 2412 struct sctp_association *asoc, uint32_t mtu) 2413 { 2414 /* 2415 * Reset the P-MTU size on this association, this involves changing 2416 * the asoc MTU, going through ANY chunk+overhead larger than mtu to 2417 * allow the DF flag to be cleared. 2418 */ 2419 struct sctp_tmit_chunk *chk; 2420 unsigned int eff_mtu, ovh; 2421 2422 asoc->smallest_mtu = mtu; 2423 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 2424 ovh = SCTP_MIN_OVERHEAD; 2425 } else { 2426 ovh = SCTP_MIN_V4_OVERHEAD; 2427 } 2428 eff_mtu = mtu - ovh; 2429 TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { 2430 if (chk->send_size > eff_mtu) { 2431 chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; 2432 } 2433 } 2434 TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { 2435 if (chk->send_size > eff_mtu) { 2436 chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; 2437 } 2438 } 2439 } 2440 2441 2442 /* 2443 * given an association and starting time of the current RTT period return 2444 * RTO in number of msecs net should point to the current network 2445 */ 2446 2447 uint32_t 2448 sctp_calculate_rto(struct sctp_tcb *stcb, 2449 struct sctp_association *asoc, 2450 struct sctp_nets *net, 2451 struct timeval *told, 2452 int safe, int rtt_from_sack) 2453 { 2454 /*- 2455 * given an association and the starting time of the current RTT 2456 * period (in value1/value2) return RTO in number of msecs. 2457 */ 2458 int32_t rtt; /* RTT in ms */ 2459 uint32_t new_rto; 2460 int first_measure = 0; 2461 struct timeval now, then, *old; 2462 2463 /* Copy it out for sparc64 */ 2464 if (safe == sctp_align_unsafe_makecopy) { 2465 old = &then; 2466 memcpy(&then, told, sizeof(struct timeval)); 2467 } else if (safe == sctp_align_safe_nocopy) { 2468 old = told; 2469 } else { 2470 /* error */ 2471 SCTP_PRINTF("Huh, bad rto calc call\n"); 2472 return (0); 2473 } 2474 /************************/ 2475 /* 1. calculate new RTT */ 2476 /************************/ 2477 /* get the current time */ 2478 if (stcb->asoc.use_precise_time) { 2479 (void)SCTP_GETPTIME_TIMEVAL(&now); 2480 } else { 2481 (void)SCTP_GETTIME_TIMEVAL(&now); 2482 } 2483 timevalsub(&now, old); 2484 /* store the current RTT in us */ 2485 net->rtt = (uint64_t)1000000 *(uint64_t)now.tv_sec + 2486 (uint64_t)now.tv_usec; 2487 2488 /* compute rtt in ms */ 2489 rtt = (int32_t)(net->rtt / 1000); 2490 if ((asoc->cc_functions.sctp_rtt_calculated) && (rtt_from_sack == SCTP_RTT_FROM_DATA)) { 2491 /* 2492 * Tell the CC module that a new update has just occurred 2493 * from a sack 2494 */ 2495 (*asoc->cc_functions.sctp_rtt_calculated) (stcb, net, &now); 2496 } 2497 /* 2498 * Do we need to determine the lan? We do this only on sacks i.e. 2499 * RTT being determined from data not non-data (HB/INIT->INITACK). 2500 */ 2501 if ((rtt_from_sack == SCTP_RTT_FROM_DATA) && 2502 (net->lan_type == SCTP_LAN_UNKNOWN)) { 2503 if (net->rtt > SCTP_LOCAL_LAN_RTT) { 2504 net->lan_type = SCTP_LAN_INTERNET; 2505 } else { 2506 net->lan_type = SCTP_LAN_LOCAL; 2507 } 2508 } 2509 /***************************/ 2510 /* 2. update RTTVAR & SRTT */ 2511 /***************************/ 2512 /*- 2513 * Compute the scaled average lastsa and the 2514 * scaled variance lastsv as described in van Jacobson 2515 * Paper "Congestion Avoidance and Control", Annex A. 2516 * 2517 * (net->lastsa >> SCTP_RTT_SHIFT) is the srtt 2518 * (net->lastsa >> SCTP_RTT_VAR_SHIFT) is the rttvar 2519 */ 2520 if (net->RTO_measured) { 2521 rtt -= (net->lastsa >> SCTP_RTT_SHIFT); 2522 net->lastsa += rtt; 2523 if (rtt < 0) { 2524 rtt = -rtt; 2525 } 2526 rtt -= (net->lastsv >> SCTP_RTT_VAR_SHIFT); 2527 net->lastsv += rtt; 2528 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RTTVAR_LOGGING_ENABLE) { 2529 rto_logging(net, SCTP_LOG_RTTVAR); 2530 } 2531 } else { 2532 /* First RTO measurment */ 2533 net->RTO_measured = 1; 2534 first_measure = 1; 2535 net->lastsa = rtt << SCTP_RTT_SHIFT; 2536 net->lastsv = (rtt / 2) << SCTP_RTT_VAR_SHIFT; 2537 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RTTVAR_LOGGING_ENABLE) { 2538 rto_logging(net, SCTP_LOG_INITIAL_RTT); 2539 } 2540 } 2541 if (net->lastsv == 0) { 2542 net->lastsv = SCTP_CLOCK_GRANULARITY; 2543 } 2544 new_rto = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; 2545 if ((new_rto > SCTP_SAT_NETWORK_MIN) && 2546 (stcb->asoc.sat_network_lockout == 0)) { 2547 stcb->asoc.sat_network = 1; 2548 } else if ((!first_measure) && stcb->asoc.sat_network) { 2549 stcb->asoc.sat_network = 0; 2550 stcb->asoc.sat_network_lockout = 1; 2551 } 2552 /* bound it, per C6/C7 in Section 5.3.1 */ 2553 if (new_rto < stcb->asoc.minrto) { 2554 new_rto = stcb->asoc.minrto; 2555 } 2556 if (new_rto > stcb->asoc.maxrto) { 2557 new_rto = stcb->asoc.maxrto; 2558 } 2559 /* we are now returning the RTO */ 2560 return (new_rto); 2561 } 2562 2563 /* 2564 * return a pointer to a contiguous piece of data from the given mbuf chain 2565 * starting at 'off' for 'len' bytes. If the desired piece spans more than 2566 * one mbuf, a copy is made at 'ptr'. caller must ensure that the buffer size 2567 * is >= 'len' returns NULL if there there isn't 'len' bytes in the chain. 2568 */ 2569 caddr_t 2570 sctp_m_getptr(struct mbuf *m, int off, int len, uint8_t *in_ptr) 2571 { 2572 uint32_t count; 2573 uint8_t *ptr; 2574 2575 ptr = in_ptr; 2576 if ((off < 0) || (len <= 0)) 2577 return (NULL); 2578 2579 /* find the desired start location */ 2580 while ((m != NULL) && (off > 0)) { 2581 if (off < SCTP_BUF_LEN(m)) 2582 break; 2583 off -= SCTP_BUF_LEN(m); 2584 m = SCTP_BUF_NEXT(m); 2585 } 2586 if (m == NULL) 2587 return (NULL); 2588 2589 /* is the current mbuf large enough (eg. contiguous)? */ 2590 if ((SCTP_BUF_LEN(m) - off) >= len) { 2591 return (mtod(m, caddr_t)+off); 2592 } else { 2593 /* else, it spans more than one mbuf, so save a temp copy... */ 2594 while ((m != NULL) && (len > 0)) { 2595 count = min(SCTP_BUF_LEN(m) - off, len); 2596 bcopy(mtod(m, caddr_t)+off, ptr, count); 2597 len -= count; 2598 ptr += count; 2599 off = 0; 2600 m = SCTP_BUF_NEXT(m); 2601 } 2602 if ((m == NULL) && (len > 0)) 2603 return (NULL); 2604 else 2605 return ((caddr_t)in_ptr); 2606 } 2607 } 2608 2609 2610 2611 struct sctp_paramhdr * 2612 sctp_get_next_param(struct mbuf *m, 2613 int offset, 2614 struct sctp_paramhdr *pull, 2615 int pull_limit) 2616 { 2617 /* This just provides a typed signature to Peter's Pull routine */ 2618 return ((struct sctp_paramhdr *)sctp_m_getptr(m, offset, pull_limit, 2619 (uint8_t *)pull)); 2620 } 2621 2622 2623 struct mbuf * 2624 sctp_add_pad_tombuf(struct mbuf *m, int padlen) 2625 { 2626 struct mbuf *m_last; 2627 caddr_t dp; 2628 2629 if (padlen > 3) { 2630 return (NULL); 2631 } 2632 if (padlen <= M_TRAILINGSPACE(m)) { 2633 /* 2634 * The easy way. We hope the majority of the time we hit 2635 * here :) 2636 */ 2637 m_last = m; 2638 } else { 2639 /* Hard way we must grow the mbuf chain */ 2640 m_last = sctp_get_mbuf_for_msg(padlen, 0, M_NOWAIT, 1, MT_DATA); 2641 if (m_last == NULL) { 2642 return (NULL); 2643 } 2644 SCTP_BUF_LEN(m_last) = 0; 2645 SCTP_BUF_NEXT(m_last) = NULL; 2646 SCTP_BUF_NEXT(m) = m_last; 2647 } 2648 dp = mtod(m_last, caddr_t)+SCTP_BUF_LEN(m_last); 2649 SCTP_BUF_LEN(m_last) += padlen; 2650 memset(dp, 0, padlen); 2651 return (m_last); 2652 } 2653 2654 struct mbuf * 2655 sctp_pad_lastmbuf(struct mbuf *m, int padval, struct mbuf *last_mbuf) 2656 { 2657 /* find the last mbuf in chain and pad it */ 2658 struct mbuf *m_at; 2659 2660 if (last_mbuf != NULL) { 2661 return (sctp_add_pad_tombuf(last_mbuf, padval)); 2662 } else { 2663 for (m_at = m; m_at; m_at = SCTP_BUF_NEXT(m_at)) { 2664 if (SCTP_BUF_NEXT(m_at) == NULL) { 2665 return (sctp_add_pad_tombuf(m_at, padval)); 2666 } 2667 } 2668 } 2669 return (NULL); 2670 } 2671 2672 static void 2673 sctp_notify_assoc_change(uint16_t state, struct sctp_tcb *stcb, 2674 uint16_t error, struct sctp_abort_chunk *abort, uint8_t from_peer, int so_locked 2675 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2676 SCTP_UNUSED 2677 #endif 2678 ) 2679 { 2680 struct mbuf *m_notify; 2681 struct sctp_assoc_change *sac; 2682 struct sctp_queued_to_read *control; 2683 unsigned int notif_len; 2684 uint16_t abort_len; 2685 unsigned int i; 2686 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 2687 struct socket *so; 2688 #endif 2689 2690 if (stcb == NULL) { 2691 return; 2692 } 2693 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVASSOCEVNT)) { 2694 notif_len = (unsigned int)sizeof(struct sctp_assoc_change); 2695 if (abort != NULL) { 2696 abort_len = ntohs(abort->ch.chunk_length); 2697 } else { 2698 abort_len = 0; 2699 } 2700 if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) { 2701 notif_len += SCTP_ASSOC_SUPPORTS_MAX; 2702 } else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) { 2703 notif_len += abort_len; 2704 } 2705 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 2706 if (m_notify == NULL) { 2707 /* Retry with smaller value. */ 2708 notif_len = (unsigned int)sizeof(struct sctp_assoc_change); 2709 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 2710 if (m_notify == NULL) { 2711 goto set_error; 2712 } 2713 } 2714 SCTP_BUF_NEXT(m_notify) = NULL; 2715 sac = mtod(m_notify, struct sctp_assoc_change *); 2716 memset(sac, 0, notif_len); 2717 sac->sac_type = SCTP_ASSOC_CHANGE; 2718 sac->sac_flags = 0; 2719 sac->sac_length = sizeof(struct sctp_assoc_change); 2720 sac->sac_state = state; 2721 sac->sac_error = error; 2722 /* XXX verify these stream counts */ 2723 sac->sac_outbound_streams = stcb->asoc.streamoutcnt; 2724 sac->sac_inbound_streams = stcb->asoc.streamincnt; 2725 sac->sac_assoc_id = sctp_get_associd(stcb); 2726 if (notif_len > sizeof(struct sctp_assoc_change)) { 2727 if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) { 2728 i = 0; 2729 if (stcb->asoc.prsctp_supported == 1) { 2730 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_PR; 2731 } 2732 if (stcb->asoc.auth_supported == 1) { 2733 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_AUTH; 2734 } 2735 if (stcb->asoc.asconf_supported == 1) { 2736 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_ASCONF; 2737 } 2738 if (stcb->asoc.idata_supported == 1) { 2739 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_INTERLEAVING; 2740 } 2741 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_MULTIBUF; 2742 if (stcb->asoc.reconfig_supported == 1) { 2743 sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_RE_CONFIG; 2744 } 2745 sac->sac_length += i; 2746 } else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) { 2747 memcpy(sac->sac_info, abort, abort_len); 2748 sac->sac_length += abort_len; 2749 } 2750 } 2751 SCTP_BUF_LEN(m_notify) = sac->sac_length; 2752 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 2753 0, 0, stcb->asoc.context, 0, 0, 0, 2754 m_notify); 2755 if (control != NULL) { 2756 control->length = SCTP_BUF_LEN(m_notify); 2757 /* not that we need this */ 2758 control->tail_mbuf = m_notify; 2759 control->spec_flags = M_NOTIFICATION; 2760 sctp_add_to_readq(stcb->sctp_ep, stcb, 2761 control, 2762 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, 2763 so_locked); 2764 } else { 2765 sctp_m_freem(m_notify); 2766 } 2767 } 2768 /* 2769 * For 1-to-1 style sockets, we send up and error when an ABORT 2770 * comes in. 2771 */ 2772 set_error: 2773 if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 2774 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && 2775 ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) { 2776 SOCK_LOCK(stcb->sctp_socket); 2777 if (from_peer) { 2778 if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_WAIT) { 2779 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNREFUSED); 2780 stcb->sctp_socket->so_error = ECONNREFUSED; 2781 } else { 2782 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); 2783 stcb->sctp_socket->so_error = ECONNRESET; 2784 } 2785 } else { 2786 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_WAIT) || 2787 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_COOKIE_ECHOED)) { 2788 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ETIMEDOUT); 2789 stcb->sctp_socket->so_error = ETIMEDOUT; 2790 } else { 2791 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNABORTED); 2792 stcb->sctp_socket->so_error = ECONNABORTED; 2793 } 2794 } 2795 } 2796 /* Wake ANY sleepers */ 2797 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 2798 so = SCTP_INP_SO(stcb->sctp_ep); 2799 if (!so_locked) { 2800 atomic_add_int(&stcb->asoc.refcnt, 1); 2801 SCTP_TCB_UNLOCK(stcb); 2802 SCTP_SOCKET_LOCK(so, 1); 2803 SCTP_TCB_LOCK(stcb); 2804 atomic_subtract_int(&stcb->asoc.refcnt, 1); 2805 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 2806 SCTP_SOCKET_UNLOCK(so, 1); 2807 return; 2808 } 2809 } 2810 #endif 2811 if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 2812 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && 2813 ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) { 2814 socantrcvmore_locked(stcb->sctp_socket); 2815 } 2816 sorwakeup(stcb->sctp_socket); 2817 sowwakeup(stcb->sctp_socket); 2818 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 2819 if (!so_locked) { 2820 SCTP_SOCKET_UNLOCK(so, 1); 2821 } 2822 #endif 2823 } 2824 2825 static void 2826 sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state, 2827 struct sockaddr *sa, uint32_t error, int so_locked 2828 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2829 SCTP_UNUSED 2830 #endif 2831 ) 2832 { 2833 struct mbuf *m_notify; 2834 struct sctp_paddr_change *spc; 2835 struct sctp_queued_to_read *control; 2836 2837 if ((stcb == NULL) || 2838 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPADDREVNT)) { 2839 /* event not enabled */ 2840 return; 2841 } 2842 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_paddr_change), 0, M_NOWAIT, 1, MT_DATA); 2843 if (m_notify == NULL) 2844 return; 2845 SCTP_BUF_LEN(m_notify) = 0; 2846 spc = mtod(m_notify, struct sctp_paddr_change *); 2847 memset(spc, 0, sizeof(struct sctp_paddr_change)); 2848 spc->spc_type = SCTP_PEER_ADDR_CHANGE; 2849 spc->spc_flags = 0; 2850 spc->spc_length = sizeof(struct sctp_paddr_change); 2851 switch (sa->sa_family) { 2852 #ifdef INET 2853 case AF_INET: 2854 #ifdef INET6 2855 if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) { 2856 in6_sin_2_v4mapsin6((struct sockaddr_in *)sa, 2857 (struct sockaddr_in6 *)&spc->spc_aaddr); 2858 } else { 2859 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in)); 2860 } 2861 #else 2862 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in)); 2863 #endif 2864 break; 2865 #endif 2866 #ifdef INET6 2867 case AF_INET6: 2868 { 2869 struct sockaddr_in6 *sin6; 2870 2871 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in6)); 2872 2873 sin6 = (struct sockaddr_in6 *)&spc->spc_aaddr; 2874 if (IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) { 2875 if (sin6->sin6_scope_id == 0) { 2876 /* recover scope_id for user */ 2877 (void)sa6_recoverscope(sin6); 2878 } else { 2879 /* clear embedded scope_id for user */ 2880 in6_clearscope(&sin6->sin6_addr); 2881 } 2882 } 2883 break; 2884 } 2885 #endif 2886 default: 2887 /* TSNH */ 2888 break; 2889 } 2890 spc->spc_state = state; 2891 spc->spc_error = error; 2892 spc->spc_assoc_id = sctp_get_associd(stcb); 2893 2894 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_paddr_change); 2895 SCTP_BUF_NEXT(m_notify) = NULL; 2896 2897 /* append to socket */ 2898 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 2899 0, 0, stcb->asoc.context, 0, 0, 0, 2900 m_notify); 2901 if (control == NULL) { 2902 /* no memory */ 2903 sctp_m_freem(m_notify); 2904 return; 2905 } 2906 control->length = SCTP_BUF_LEN(m_notify); 2907 control->spec_flags = M_NOTIFICATION; 2908 /* not that we need this */ 2909 control->tail_mbuf = m_notify; 2910 sctp_add_to_readq(stcb->sctp_ep, stcb, 2911 control, 2912 &stcb->sctp_socket->so_rcv, 1, 2913 SCTP_READ_LOCK_NOT_HELD, 2914 so_locked); 2915 } 2916 2917 2918 static void 2919 sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error, 2920 struct sctp_tmit_chunk *chk, int so_locked 2921 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2922 SCTP_UNUSED 2923 #endif 2924 ) 2925 { 2926 struct mbuf *m_notify; 2927 struct sctp_send_failed *ssf; 2928 struct sctp_send_failed_event *ssfe; 2929 struct sctp_queued_to_read *control; 2930 struct sctp_chunkhdr *chkhdr; 2931 int notifhdr_len, chk_len, chkhdr_len, padding_len, payload_len; 2932 2933 if ((stcb == NULL) || 2934 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && 2935 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { 2936 /* event not enabled */ 2937 return; 2938 } 2939 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 2940 notifhdr_len = sizeof(struct sctp_send_failed_event); 2941 } else { 2942 notifhdr_len = sizeof(struct sctp_send_failed); 2943 } 2944 m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA); 2945 if (m_notify == NULL) 2946 /* no space left */ 2947 return; 2948 SCTP_BUF_LEN(m_notify) = notifhdr_len; 2949 if (stcb->asoc.idata_supported) { 2950 chkhdr_len = sizeof(struct sctp_idata_chunk); 2951 } else { 2952 chkhdr_len = sizeof(struct sctp_data_chunk); 2953 } 2954 /* Use some defaults in case we can't access the chunk header */ 2955 if (chk->send_size >= chkhdr_len) { 2956 payload_len = chk->send_size - chkhdr_len; 2957 } else { 2958 payload_len = 0; 2959 } 2960 padding_len = 0; 2961 if (chk->data != NULL) { 2962 chkhdr = mtod(chk->data, struct sctp_chunkhdr *); 2963 if (chkhdr != NULL) { 2964 chk_len = ntohs(chkhdr->chunk_length); 2965 if ((chk_len >= chkhdr_len) && 2966 (chk->send_size >= chk_len) && 2967 (chk->send_size - chk_len < 4)) { 2968 padding_len = chk->send_size - chk_len; 2969 payload_len = chk->send_size - chkhdr_len - padding_len; 2970 } 2971 } 2972 } 2973 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 2974 ssfe = mtod(m_notify, struct sctp_send_failed_event *); 2975 memset(ssfe, 0, notifhdr_len); 2976 ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT; 2977 if (sent) { 2978 ssfe->ssfe_flags = SCTP_DATA_SENT; 2979 } else { 2980 ssfe->ssfe_flags = SCTP_DATA_UNSENT; 2981 } 2982 ssfe->ssfe_length = (uint32_t)(notifhdr_len + payload_len); 2983 ssfe->ssfe_error = error; 2984 /* not exactly what the user sent in, but should be close :) */ 2985 ssfe->ssfe_info.snd_sid = chk->rec.data.sid; 2986 ssfe->ssfe_info.snd_flags = chk->rec.data.rcv_flags; 2987 ssfe->ssfe_info.snd_ppid = chk->rec.data.ppid; 2988 ssfe->ssfe_info.snd_context = chk->rec.data.context; 2989 ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); 2990 ssfe->ssfe_assoc_id = sctp_get_associd(stcb); 2991 } else { 2992 ssf = mtod(m_notify, struct sctp_send_failed *); 2993 memset(ssf, 0, notifhdr_len); 2994 ssf->ssf_type = SCTP_SEND_FAILED; 2995 if (sent) { 2996 ssf->ssf_flags = SCTP_DATA_SENT; 2997 } else { 2998 ssf->ssf_flags = SCTP_DATA_UNSENT; 2999 } 3000 ssf->ssf_length = (uint32_t)(notifhdr_len + payload_len); 3001 ssf->ssf_error = error; 3002 /* not exactly what the user sent in, but should be close :) */ 3003 ssf->ssf_info.sinfo_stream = chk->rec.data.sid; 3004 ssf->ssf_info.sinfo_ssn = (uint16_t)chk->rec.data.mid; 3005 ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags; 3006 ssf->ssf_info.sinfo_ppid = chk->rec.data.ppid; 3007 ssf->ssf_info.sinfo_context = chk->rec.data.context; 3008 ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); 3009 ssf->ssf_assoc_id = sctp_get_associd(stcb); 3010 } 3011 if (chk->data != NULL) { 3012 /* Trim off the sctp chunk header (it should be there) */ 3013 if (chk->send_size == chkhdr_len + payload_len + padding_len) { 3014 m_adj(chk->data, chkhdr_len); 3015 m_adj(chk->data, -padding_len); 3016 sctp_mbuf_crush(chk->data); 3017 chk->send_size -= (chkhdr_len + padding_len); 3018 } 3019 } 3020 SCTP_BUF_NEXT(m_notify) = chk->data; 3021 /* Steal off the mbuf */ 3022 chk->data = NULL; 3023 /* 3024 * For this case, we check the actual socket buffer, since the assoc 3025 * is going away we don't want to overfill the socket buffer for a 3026 * non-reader 3027 */ 3028 if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3029 sctp_m_freem(m_notify); 3030 return; 3031 } 3032 /* append to socket */ 3033 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3034 0, 0, stcb->asoc.context, 0, 0, 0, 3035 m_notify); 3036 if (control == NULL) { 3037 /* no memory */ 3038 sctp_m_freem(m_notify); 3039 return; 3040 } 3041 control->spec_flags = M_NOTIFICATION; 3042 sctp_add_to_readq(stcb->sctp_ep, stcb, 3043 control, 3044 &stcb->sctp_socket->so_rcv, 1, 3045 SCTP_READ_LOCK_NOT_HELD, 3046 so_locked); 3047 } 3048 3049 3050 static void 3051 sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, 3052 struct sctp_stream_queue_pending *sp, int so_locked 3053 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3054 SCTP_UNUSED 3055 #endif 3056 ) 3057 { 3058 struct mbuf *m_notify; 3059 struct sctp_send_failed *ssf; 3060 struct sctp_send_failed_event *ssfe; 3061 struct sctp_queued_to_read *control; 3062 int notifhdr_len; 3063 3064 if ((stcb == NULL) || 3065 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && 3066 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { 3067 /* event not enabled */ 3068 return; 3069 } 3070 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 3071 notifhdr_len = sizeof(struct sctp_send_failed_event); 3072 } else { 3073 notifhdr_len = sizeof(struct sctp_send_failed); 3074 } 3075 m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA); 3076 if (m_notify == NULL) { 3077 /* no space left */ 3078 return; 3079 } 3080 SCTP_BUF_LEN(m_notify) = notifhdr_len; 3081 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 3082 ssfe = mtod(m_notify, struct sctp_send_failed_event *); 3083 memset(ssfe, 0, notifhdr_len); 3084 ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT; 3085 ssfe->ssfe_flags = SCTP_DATA_UNSENT; 3086 ssfe->ssfe_length = (uint32_t)(notifhdr_len + sp->length); 3087 ssfe->ssfe_error = error; 3088 /* not exactly what the user sent in, but should be close :) */ 3089 ssfe->ssfe_info.snd_sid = sp->sid; 3090 if (sp->some_taken) { 3091 ssfe->ssfe_info.snd_flags = SCTP_DATA_LAST_FRAG; 3092 } else { 3093 ssfe->ssfe_info.snd_flags = SCTP_DATA_NOT_FRAG; 3094 } 3095 ssfe->ssfe_info.snd_ppid = sp->ppid; 3096 ssfe->ssfe_info.snd_context = sp->context; 3097 ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); 3098 ssfe->ssfe_assoc_id = sctp_get_associd(stcb); 3099 } else { 3100 ssf = mtod(m_notify, struct sctp_send_failed *); 3101 memset(ssf, 0, notifhdr_len); 3102 ssf->ssf_type = SCTP_SEND_FAILED; 3103 ssf->ssf_flags = SCTP_DATA_UNSENT; 3104 ssf->ssf_length = (uint32_t)(notifhdr_len + sp->length); 3105 ssf->ssf_error = error; 3106 /* not exactly what the user sent in, but should be close :) */ 3107 ssf->ssf_info.sinfo_stream = sp->sid; 3108 ssf->ssf_info.sinfo_ssn = 0; 3109 if (sp->some_taken) { 3110 ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; 3111 } else { 3112 ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; 3113 } 3114 ssf->ssf_info.sinfo_ppid = sp->ppid; 3115 ssf->ssf_info.sinfo_context = sp->context; 3116 ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); 3117 ssf->ssf_assoc_id = sctp_get_associd(stcb); 3118 } 3119 SCTP_BUF_NEXT(m_notify) = sp->data; 3120 3121 /* Steal off the mbuf */ 3122 sp->data = NULL; 3123 /* 3124 * For this case, we check the actual socket buffer, since the assoc 3125 * is going away we don't want to overfill the socket buffer for a 3126 * non-reader 3127 */ 3128 if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3129 sctp_m_freem(m_notify); 3130 return; 3131 } 3132 /* append to socket */ 3133 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3134 0, 0, stcb->asoc.context, 0, 0, 0, 3135 m_notify); 3136 if (control == NULL) { 3137 /* no memory */ 3138 sctp_m_freem(m_notify); 3139 return; 3140 } 3141 control->spec_flags = M_NOTIFICATION; 3142 sctp_add_to_readq(stcb->sctp_ep, stcb, 3143 control, 3144 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); 3145 } 3146 3147 3148 3149 static void 3150 sctp_notify_adaptation_layer(struct sctp_tcb *stcb) 3151 { 3152 struct mbuf *m_notify; 3153 struct sctp_adaptation_event *sai; 3154 struct sctp_queued_to_read *control; 3155 3156 if ((stcb == NULL) || 3157 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ADAPTATIONEVNT)) { 3158 /* event not enabled */ 3159 return; 3160 } 3161 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_adaption_event), 0, M_NOWAIT, 1, MT_DATA); 3162 if (m_notify == NULL) 3163 /* no space left */ 3164 return; 3165 SCTP_BUF_LEN(m_notify) = 0; 3166 sai = mtod(m_notify, struct sctp_adaptation_event *); 3167 memset(sai, 0, sizeof(struct sctp_adaptation_event)); 3168 sai->sai_type = SCTP_ADAPTATION_INDICATION; 3169 sai->sai_flags = 0; 3170 sai->sai_length = sizeof(struct sctp_adaptation_event); 3171 sai->sai_adaptation_ind = stcb->asoc.peers_adaptation; 3172 sai->sai_assoc_id = sctp_get_associd(stcb); 3173 3174 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_adaptation_event); 3175 SCTP_BUF_NEXT(m_notify) = NULL; 3176 3177 /* append to socket */ 3178 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3179 0, 0, stcb->asoc.context, 0, 0, 0, 3180 m_notify); 3181 if (control == NULL) { 3182 /* no memory */ 3183 sctp_m_freem(m_notify); 3184 return; 3185 } 3186 control->length = SCTP_BUF_LEN(m_notify); 3187 control->spec_flags = M_NOTIFICATION; 3188 /* not that we need this */ 3189 control->tail_mbuf = m_notify; 3190 sctp_add_to_readq(stcb->sctp_ep, stcb, 3191 control, 3192 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3193 } 3194 3195 /* This always must be called with the read-queue LOCKED in the INP */ 3196 static void 3197 sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error, 3198 uint32_t val, int so_locked 3199 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3200 SCTP_UNUSED 3201 #endif 3202 ) 3203 { 3204 struct mbuf *m_notify; 3205 struct sctp_pdapi_event *pdapi; 3206 struct sctp_queued_to_read *control; 3207 struct sockbuf *sb; 3208 3209 if ((stcb == NULL) || 3210 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_PDAPIEVNT)) { 3211 /* event not enabled */ 3212 return; 3213 } 3214 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) { 3215 return; 3216 } 3217 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_pdapi_event), 0, M_NOWAIT, 1, MT_DATA); 3218 if (m_notify == NULL) 3219 /* no space left */ 3220 return; 3221 SCTP_BUF_LEN(m_notify) = 0; 3222 pdapi = mtod(m_notify, struct sctp_pdapi_event *); 3223 memset(pdapi, 0, sizeof(struct sctp_pdapi_event)); 3224 pdapi->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT; 3225 pdapi->pdapi_flags = 0; 3226 pdapi->pdapi_length = sizeof(struct sctp_pdapi_event); 3227 pdapi->pdapi_indication = error; 3228 pdapi->pdapi_stream = (val >> 16); 3229 pdapi->pdapi_seq = (val & 0x0000ffff); 3230 pdapi->pdapi_assoc_id = sctp_get_associd(stcb); 3231 3232 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_pdapi_event); 3233 SCTP_BUF_NEXT(m_notify) = NULL; 3234 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3235 0, 0, stcb->asoc.context, 0, 0, 0, 3236 m_notify); 3237 if (control == NULL) { 3238 /* no memory */ 3239 sctp_m_freem(m_notify); 3240 return; 3241 } 3242 control->spec_flags = M_NOTIFICATION; 3243 control->length = SCTP_BUF_LEN(m_notify); 3244 /* not that we need this */ 3245 control->tail_mbuf = m_notify; 3246 control->held_length = 0; 3247 control->length = 0; 3248 sb = &stcb->sctp_socket->so_rcv; 3249 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 3250 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m_notify)); 3251 } 3252 sctp_sballoc(stcb, sb, m_notify); 3253 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 3254 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 3255 } 3256 atomic_add_int(&control->length, SCTP_BUF_LEN(m_notify)); 3257 control->end_added = 1; 3258 if (stcb->asoc.control_pdapi) 3259 TAILQ_INSERT_AFTER(&stcb->sctp_ep->read_queue, stcb->asoc.control_pdapi, control, next); 3260 else { 3261 /* we really should not see this case */ 3262 TAILQ_INSERT_TAIL(&stcb->sctp_ep->read_queue, control, next); 3263 } 3264 if (stcb->sctp_ep && stcb->sctp_socket) { 3265 /* This should always be the case */ 3266 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3267 struct socket *so; 3268 3269 so = SCTP_INP_SO(stcb->sctp_ep); 3270 if (!so_locked) { 3271 atomic_add_int(&stcb->asoc.refcnt, 1); 3272 SCTP_TCB_UNLOCK(stcb); 3273 SCTP_SOCKET_LOCK(so, 1); 3274 SCTP_TCB_LOCK(stcb); 3275 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3276 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 3277 SCTP_SOCKET_UNLOCK(so, 1); 3278 return; 3279 } 3280 } 3281 #endif 3282 sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); 3283 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3284 if (!so_locked) { 3285 SCTP_SOCKET_UNLOCK(so, 1); 3286 } 3287 #endif 3288 } 3289 } 3290 3291 static void 3292 sctp_notify_shutdown_event(struct sctp_tcb *stcb) 3293 { 3294 struct mbuf *m_notify; 3295 struct sctp_shutdown_event *sse; 3296 struct sctp_queued_to_read *control; 3297 3298 /* 3299 * For TCP model AND UDP connected sockets we will send an error up 3300 * when an SHUTDOWN completes 3301 */ 3302 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 3303 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { 3304 /* mark socket closed for read/write and wakeup! */ 3305 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3306 struct socket *so; 3307 3308 so = SCTP_INP_SO(stcb->sctp_ep); 3309 atomic_add_int(&stcb->asoc.refcnt, 1); 3310 SCTP_TCB_UNLOCK(stcb); 3311 SCTP_SOCKET_LOCK(so, 1); 3312 SCTP_TCB_LOCK(stcb); 3313 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3314 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 3315 SCTP_SOCKET_UNLOCK(so, 1); 3316 return; 3317 } 3318 #endif 3319 socantsendmore(stcb->sctp_socket); 3320 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3321 SCTP_SOCKET_UNLOCK(so, 1); 3322 #endif 3323 } 3324 if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT)) { 3325 /* event not enabled */ 3326 return; 3327 } 3328 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_event), 0, M_NOWAIT, 1, MT_DATA); 3329 if (m_notify == NULL) 3330 /* no space left */ 3331 return; 3332 sse = mtod(m_notify, struct sctp_shutdown_event *); 3333 memset(sse, 0, sizeof(struct sctp_shutdown_event)); 3334 sse->sse_type = SCTP_SHUTDOWN_EVENT; 3335 sse->sse_flags = 0; 3336 sse->sse_length = sizeof(struct sctp_shutdown_event); 3337 sse->sse_assoc_id = sctp_get_associd(stcb); 3338 3339 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_shutdown_event); 3340 SCTP_BUF_NEXT(m_notify) = NULL; 3341 3342 /* append to socket */ 3343 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3344 0, 0, stcb->asoc.context, 0, 0, 0, 3345 m_notify); 3346 if (control == NULL) { 3347 /* no memory */ 3348 sctp_m_freem(m_notify); 3349 return; 3350 } 3351 control->spec_flags = M_NOTIFICATION; 3352 control->length = SCTP_BUF_LEN(m_notify); 3353 /* not that we need this */ 3354 control->tail_mbuf = m_notify; 3355 sctp_add_to_readq(stcb->sctp_ep, stcb, 3356 control, 3357 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3358 } 3359 3360 static void 3361 sctp_notify_sender_dry_event(struct sctp_tcb *stcb, 3362 int so_locked 3363 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3364 SCTP_UNUSED 3365 #endif 3366 ) 3367 { 3368 struct mbuf *m_notify; 3369 struct sctp_sender_dry_event *event; 3370 struct sctp_queued_to_read *control; 3371 3372 if ((stcb == NULL) || 3373 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_DRYEVNT)) { 3374 /* event not enabled */ 3375 return; 3376 } 3377 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_sender_dry_event), 0, M_NOWAIT, 1, MT_DATA); 3378 if (m_notify == NULL) { 3379 /* no space left */ 3380 return; 3381 } 3382 SCTP_BUF_LEN(m_notify) = 0; 3383 event = mtod(m_notify, struct sctp_sender_dry_event *); 3384 memset(event, 0, sizeof(struct sctp_sender_dry_event)); 3385 event->sender_dry_type = SCTP_SENDER_DRY_EVENT; 3386 event->sender_dry_flags = 0; 3387 event->sender_dry_length = sizeof(struct sctp_sender_dry_event); 3388 event->sender_dry_assoc_id = sctp_get_associd(stcb); 3389 3390 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_sender_dry_event); 3391 SCTP_BUF_NEXT(m_notify) = NULL; 3392 3393 /* append to socket */ 3394 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3395 0, 0, stcb->asoc.context, 0, 0, 0, 3396 m_notify); 3397 if (control == NULL) { 3398 /* no memory */ 3399 sctp_m_freem(m_notify); 3400 return; 3401 } 3402 control->length = SCTP_BUF_LEN(m_notify); 3403 control->spec_flags = M_NOTIFICATION; 3404 /* not that we need this */ 3405 control->tail_mbuf = m_notify; 3406 sctp_add_to_readq(stcb->sctp_ep, stcb, control, 3407 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); 3408 } 3409 3410 3411 void 3412 sctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, uint16_t numberout, int flag) 3413 { 3414 struct mbuf *m_notify; 3415 struct sctp_queued_to_read *control; 3416 struct sctp_stream_change_event *stradd; 3417 3418 if ((stcb == NULL) || 3419 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_CHANGEEVNT))) { 3420 /* event not enabled */ 3421 return; 3422 } 3423 if ((stcb->asoc.peer_req_out) && flag) { 3424 /* Peer made the request, don't tell the local user */ 3425 stcb->asoc.peer_req_out = 0; 3426 return; 3427 } 3428 stcb->asoc.peer_req_out = 0; 3429 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_stream_change_event), 0, M_NOWAIT, 1, MT_DATA); 3430 if (m_notify == NULL) 3431 /* no space left */ 3432 return; 3433 SCTP_BUF_LEN(m_notify) = 0; 3434 stradd = mtod(m_notify, struct sctp_stream_change_event *); 3435 memset(stradd, 0, sizeof(struct sctp_stream_change_event)); 3436 stradd->strchange_type = SCTP_STREAM_CHANGE_EVENT; 3437 stradd->strchange_flags = flag; 3438 stradd->strchange_length = sizeof(struct sctp_stream_change_event); 3439 stradd->strchange_assoc_id = sctp_get_associd(stcb); 3440 stradd->strchange_instrms = numberin; 3441 stradd->strchange_outstrms = numberout; 3442 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_stream_change_event); 3443 SCTP_BUF_NEXT(m_notify) = NULL; 3444 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3445 /* no space */ 3446 sctp_m_freem(m_notify); 3447 return; 3448 } 3449 /* append to socket */ 3450 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3451 0, 0, stcb->asoc.context, 0, 0, 0, 3452 m_notify); 3453 if (control == NULL) { 3454 /* no memory */ 3455 sctp_m_freem(m_notify); 3456 return; 3457 } 3458 control->spec_flags = M_NOTIFICATION; 3459 control->length = SCTP_BUF_LEN(m_notify); 3460 /* not that we need this */ 3461 control->tail_mbuf = m_notify; 3462 sctp_add_to_readq(stcb->sctp_ep, stcb, 3463 control, 3464 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3465 } 3466 3467 void 3468 sctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32_t recv_tsn, int flag) 3469 { 3470 struct mbuf *m_notify; 3471 struct sctp_queued_to_read *control; 3472 struct sctp_assoc_reset_event *strasoc; 3473 3474 if ((stcb == NULL) || 3475 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ASSOC_RESETEVNT))) { 3476 /* event not enabled */ 3477 return; 3478 } 3479 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_assoc_reset_event), 0, M_NOWAIT, 1, MT_DATA); 3480 if (m_notify == NULL) 3481 /* no space left */ 3482 return; 3483 SCTP_BUF_LEN(m_notify) = 0; 3484 strasoc = mtod(m_notify, struct sctp_assoc_reset_event *); 3485 memset(strasoc, 0, sizeof(struct sctp_assoc_reset_event)); 3486 strasoc->assocreset_type = SCTP_ASSOC_RESET_EVENT; 3487 strasoc->assocreset_flags = flag; 3488 strasoc->assocreset_length = sizeof(struct sctp_assoc_reset_event); 3489 strasoc->assocreset_assoc_id = sctp_get_associd(stcb); 3490 strasoc->assocreset_local_tsn = sending_tsn; 3491 strasoc->assocreset_remote_tsn = recv_tsn; 3492 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_assoc_reset_event); 3493 SCTP_BUF_NEXT(m_notify) = NULL; 3494 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3495 /* no space */ 3496 sctp_m_freem(m_notify); 3497 return; 3498 } 3499 /* append to socket */ 3500 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3501 0, 0, stcb->asoc.context, 0, 0, 0, 3502 m_notify); 3503 if (control == NULL) { 3504 /* no memory */ 3505 sctp_m_freem(m_notify); 3506 return; 3507 } 3508 control->spec_flags = M_NOTIFICATION; 3509 control->length = SCTP_BUF_LEN(m_notify); 3510 /* not that we need this */ 3511 control->tail_mbuf = m_notify; 3512 sctp_add_to_readq(stcb->sctp_ep, stcb, 3513 control, 3514 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3515 } 3516 3517 3518 3519 static void 3520 sctp_notify_stream_reset(struct sctp_tcb *stcb, 3521 int number_entries, uint16_t *list, int flag) 3522 { 3523 struct mbuf *m_notify; 3524 struct sctp_queued_to_read *control; 3525 struct sctp_stream_reset_event *strreset; 3526 int len; 3527 3528 if ((stcb == NULL) || 3529 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT))) { 3530 /* event not enabled */ 3531 return; 3532 } 3533 m_notify = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 3534 if (m_notify == NULL) 3535 /* no space left */ 3536 return; 3537 SCTP_BUF_LEN(m_notify) = 0; 3538 len = sizeof(struct sctp_stream_reset_event) + (number_entries * sizeof(uint16_t)); 3539 if (len > M_TRAILINGSPACE(m_notify)) { 3540 /* never enough room */ 3541 sctp_m_freem(m_notify); 3542 return; 3543 } 3544 strreset = mtod(m_notify, struct sctp_stream_reset_event *); 3545 memset(strreset, 0, len); 3546 strreset->strreset_type = SCTP_STREAM_RESET_EVENT; 3547 strreset->strreset_flags = flag; 3548 strreset->strreset_length = len; 3549 strreset->strreset_assoc_id = sctp_get_associd(stcb); 3550 if (number_entries) { 3551 int i; 3552 3553 for (i = 0; i < number_entries; i++) { 3554 strreset->strreset_stream_list[i] = ntohs(list[i]); 3555 } 3556 } 3557 SCTP_BUF_LEN(m_notify) = len; 3558 SCTP_BUF_NEXT(m_notify) = NULL; 3559 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3560 /* no space */ 3561 sctp_m_freem(m_notify); 3562 return; 3563 } 3564 /* append to socket */ 3565 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3566 0, 0, stcb->asoc.context, 0, 0, 0, 3567 m_notify); 3568 if (control == NULL) { 3569 /* no memory */ 3570 sctp_m_freem(m_notify); 3571 return; 3572 } 3573 control->spec_flags = M_NOTIFICATION; 3574 control->length = SCTP_BUF_LEN(m_notify); 3575 /* not that we need this */ 3576 control->tail_mbuf = m_notify; 3577 sctp_add_to_readq(stcb->sctp_ep, stcb, 3578 control, 3579 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3580 } 3581 3582 3583 static void 3584 sctp_notify_remote_error(struct sctp_tcb *stcb, uint16_t error, struct sctp_error_chunk *chunk) 3585 { 3586 struct mbuf *m_notify; 3587 struct sctp_remote_error *sre; 3588 struct sctp_queued_to_read *control; 3589 unsigned int notif_len; 3590 uint16_t chunk_len; 3591 3592 if ((stcb == NULL) || 3593 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPEERERR)) { 3594 return; 3595 } 3596 if (chunk != NULL) { 3597 chunk_len = ntohs(chunk->ch.chunk_length); 3598 } else { 3599 chunk_len = 0; 3600 } 3601 notif_len = (unsigned int)(sizeof(struct sctp_remote_error) + chunk_len); 3602 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 3603 if (m_notify == NULL) { 3604 /* Retry with smaller value. */ 3605 notif_len = (unsigned int)sizeof(struct sctp_remote_error); 3606 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 3607 if (m_notify == NULL) { 3608 return; 3609 } 3610 } 3611 SCTP_BUF_NEXT(m_notify) = NULL; 3612 sre = mtod(m_notify, struct sctp_remote_error *); 3613 memset(sre, 0, notif_len); 3614 sre->sre_type = SCTP_REMOTE_ERROR; 3615 sre->sre_flags = 0; 3616 sre->sre_length = sizeof(struct sctp_remote_error); 3617 sre->sre_error = error; 3618 sre->sre_assoc_id = sctp_get_associd(stcb); 3619 if (notif_len > sizeof(struct sctp_remote_error)) { 3620 memcpy(sre->sre_data, chunk, chunk_len); 3621 sre->sre_length += chunk_len; 3622 } 3623 SCTP_BUF_LEN(m_notify) = sre->sre_length; 3624 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3625 0, 0, stcb->asoc.context, 0, 0, 0, 3626 m_notify); 3627 if (control != NULL) { 3628 control->length = SCTP_BUF_LEN(m_notify); 3629 /* not that we need this */ 3630 control->tail_mbuf = m_notify; 3631 control->spec_flags = M_NOTIFICATION; 3632 sctp_add_to_readq(stcb->sctp_ep, stcb, 3633 control, 3634 &stcb->sctp_socket->so_rcv, 1, 3635 SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3636 } else { 3637 sctp_m_freem(m_notify); 3638 } 3639 } 3640 3641 3642 void 3643 sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, 3644 uint32_t error, void *data, int so_locked 3645 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3646 SCTP_UNUSED 3647 #endif 3648 ) 3649 { 3650 if ((stcb == NULL) || 3651 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3652 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3653 (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { 3654 /* If the socket is gone we are out of here */ 3655 return; 3656 } 3657 if (stcb->sctp_socket->so_rcv.sb_state & SBS_CANTRCVMORE) { 3658 return; 3659 } 3660 if ((stcb->asoc.state & SCTP_STATE_COOKIE_WAIT) || 3661 (stcb->asoc.state & SCTP_STATE_COOKIE_ECHOED)) { 3662 if ((notification == SCTP_NOTIFY_INTERFACE_DOWN) || 3663 (notification == SCTP_NOTIFY_INTERFACE_UP) || 3664 (notification == SCTP_NOTIFY_INTERFACE_CONFIRMED)) { 3665 /* Don't report these in front states */ 3666 return; 3667 } 3668 } 3669 switch (notification) { 3670 case SCTP_NOTIFY_ASSOC_UP: 3671 if (stcb->asoc.assoc_up_sent == 0) { 3672 sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, 0, so_locked); 3673 stcb->asoc.assoc_up_sent = 1; 3674 } 3675 if (stcb->asoc.adaptation_needed && (stcb->asoc.adaptation_sent == 0)) { 3676 sctp_notify_adaptation_layer(stcb); 3677 } 3678 if (stcb->asoc.auth_supported == 0) { 3679 sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, 3680 NULL, so_locked); 3681 } 3682 break; 3683 case SCTP_NOTIFY_ASSOC_DOWN: 3684 sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, 0, so_locked); 3685 break; 3686 case SCTP_NOTIFY_INTERFACE_DOWN: 3687 { 3688 struct sctp_nets *net; 3689 3690 net = (struct sctp_nets *)data; 3691 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_UNREACHABLE, 3692 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3693 break; 3694 } 3695 case SCTP_NOTIFY_INTERFACE_UP: 3696 { 3697 struct sctp_nets *net; 3698 3699 net = (struct sctp_nets *)data; 3700 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_AVAILABLE, 3701 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3702 break; 3703 } 3704 case SCTP_NOTIFY_INTERFACE_CONFIRMED: 3705 { 3706 struct sctp_nets *net; 3707 3708 net = (struct sctp_nets *)data; 3709 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_CONFIRMED, 3710 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3711 break; 3712 } 3713 case SCTP_NOTIFY_SPECIAL_SP_FAIL: 3714 sctp_notify_send_failed2(stcb, error, 3715 (struct sctp_stream_queue_pending *)data, so_locked); 3716 break; 3717 case SCTP_NOTIFY_SENT_DG_FAIL: 3718 sctp_notify_send_failed(stcb, 1, error, 3719 (struct sctp_tmit_chunk *)data, so_locked); 3720 break; 3721 case SCTP_NOTIFY_UNSENT_DG_FAIL: 3722 sctp_notify_send_failed(stcb, 0, error, 3723 (struct sctp_tmit_chunk *)data, so_locked); 3724 break; 3725 case SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION: 3726 { 3727 uint32_t val; 3728 3729 val = *((uint32_t *)data); 3730 3731 sctp_notify_partial_delivery_indication(stcb, error, val, so_locked); 3732 break; 3733 } 3734 case SCTP_NOTIFY_ASSOC_LOC_ABORTED: 3735 if (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || 3736 ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED)) { 3737 sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 0, so_locked); 3738 } else { 3739 sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 0, so_locked); 3740 } 3741 break; 3742 case SCTP_NOTIFY_ASSOC_REM_ABORTED: 3743 if (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || 3744 ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED)) { 3745 sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 1, so_locked); 3746 } else { 3747 sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 1, so_locked); 3748 } 3749 break; 3750 case SCTP_NOTIFY_ASSOC_RESTART: 3751 sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, 0, so_locked); 3752 if (stcb->asoc.auth_supported == 0) { 3753 sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, 3754 NULL, so_locked); 3755 } 3756 break; 3757 case SCTP_NOTIFY_STR_RESET_SEND: 3758 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_OUTGOING_SSN); 3759 break; 3760 case SCTP_NOTIFY_STR_RESET_RECV: 3761 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_INCOMING); 3762 break; 3763 case SCTP_NOTIFY_STR_RESET_FAILED_OUT: 3764 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3765 (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_FAILED)); 3766 break; 3767 case SCTP_NOTIFY_STR_RESET_DENIED_OUT: 3768 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3769 (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_DENIED)); 3770 break; 3771 case SCTP_NOTIFY_STR_RESET_FAILED_IN: 3772 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3773 (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_FAILED)); 3774 break; 3775 case SCTP_NOTIFY_STR_RESET_DENIED_IN: 3776 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3777 (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_DENIED)); 3778 break; 3779 case SCTP_NOTIFY_ASCONF_ADD_IP: 3780 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data, 3781 error, so_locked); 3782 break; 3783 case SCTP_NOTIFY_ASCONF_DELETE_IP: 3784 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_REMOVED, data, 3785 error, so_locked); 3786 break; 3787 case SCTP_NOTIFY_ASCONF_SET_PRIMARY: 3788 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_MADE_PRIM, data, 3789 error, so_locked); 3790 break; 3791 case SCTP_NOTIFY_PEER_SHUTDOWN: 3792 sctp_notify_shutdown_event(stcb); 3793 break; 3794 case SCTP_NOTIFY_AUTH_NEW_KEY: 3795 sctp_notify_authentication(stcb, SCTP_AUTH_NEW_KEY, error, 3796 (uint16_t)(uintptr_t)data, 3797 so_locked); 3798 break; 3799 case SCTP_NOTIFY_AUTH_FREE_KEY: 3800 sctp_notify_authentication(stcb, SCTP_AUTH_FREE_KEY, error, 3801 (uint16_t)(uintptr_t)data, 3802 so_locked); 3803 break; 3804 case SCTP_NOTIFY_NO_PEER_AUTH: 3805 sctp_notify_authentication(stcb, SCTP_AUTH_NO_AUTH, error, 3806 (uint16_t)(uintptr_t)data, 3807 so_locked); 3808 break; 3809 case SCTP_NOTIFY_SENDER_DRY: 3810 sctp_notify_sender_dry_event(stcb, so_locked); 3811 break; 3812 case SCTP_NOTIFY_REMOTE_ERROR: 3813 sctp_notify_remote_error(stcb, error, data); 3814 break; 3815 default: 3816 SCTPDBG(SCTP_DEBUG_UTIL1, "%s: unknown notification %xh (%u)\n", 3817 __func__, notification, notification); 3818 break; 3819 } /* end switch */ 3820 } 3821 3822 void 3823 sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock, int so_locked 3824 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3825 SCTP_UNUSED 3826 #endif 3827 ) 3828 { 3829 struct sctp_association *asoc; 3830 struct sctp_stream_out *outs; 3831 struct sctp_tmit_chunk *chk, *nchk; 3832 struct sctp_stream_queue_pending *sp, *nsp; 3833 int i; 3834 3835 if (stcb == NULL) { 3836 return; 3837 } 3838 asoc = &stcb->asoc; 3839 if (asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) { 3840 /* already being freed */ 3841 return; 3842 } 3843 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3844 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3845 (asoc->state & SCTP_STATE_CLOSED_SOCKET)) { 3846 return; 3847 } 3848 /* now through all the gunk freeing chunks */ 3849 if (holds_lock == 0) { 3850 SCTP_TCB_SEND_LOCK(stcb); 3851 } 3852 /* sent queue SHOULD be empty */ 3853 TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) { 3854 TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next); 3855 asoc->sent_queue_cnt--; 3856 if (chk->sent != SCTP_DATAGRAM_NR_ACKED) { 3857 if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) { 3858 asoc->strmout[chk->rec.data.sid].chunks_on_queues--; 3859 #ifdef INVARIANTS 3860 } else { 3861 panic("No chunks on the queues for sid %u.", chk->rec.data.sid); 3862 #endif 3863 } 3864 } 3865 if (chk->data != NULL) { 3866 sctp_free_bufspace(stcb, asoc, chk, 1); 3867 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 3868 error, chk, so_locked); 3869 if (chk->data) { 3870 sctp_m_freem(chk->data); 3871 chk->data = NULL; 3872 } 3873 } 3874 sctp_free_a_chunk(stcb, chk, so_locked); 3875 /* sa_ignore FREED_MEMORY */ 3876 } 3877 /* pending send queue SHOULD be empty */ 3878 TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) { 3879 TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next); 3880 asoc->send_queue_cnt--; 3881 if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) { 3882 asoc->strmout[chk->rec.data.sid].chunks_on_queues--; 3883 #ifdef INVARIANTS 3884 } else { 3885 panic("No chunks on the queues for sid %u.", chk->rec.data.sid); 3886 #endif 3887 } 3888 if (chk->data != NULL) { 3889 sctp_free_bufspace(stcb, asoc, chk, 1); 3890 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 3891 error, chk, so_locked); 3892 if (chk->data) { 3893 sctp_m_freem(chk->data); 3894 chk->data = NULL; 3895 } 3896 } 3897 sctp_free_a_chunk(stcb, chk, so_locked); 3898 /* sa_ignore FREED_MEMORY */ 3899 } 3900 for (i = 0; i < asoc->streamoutcnt; i++) { 3901 /* For each stream */ 3902 outs = &asoc->strmout[i]; 3903 /* clean up any sends there */ 3904 TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) { 3905 atomic_subtract_int(&asoc->stream_queue_cnt, 1); 3906 TAILQ_REMOVE(&outs->outqueue, sp, next); 3907 stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, holds_lock); 3908 sctp_free_spbufspace(stcb, asoc, sp); 3909 if (sp->data) { 3910 sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, 3911 error, (void *)sp, so_locked); 3912 if (sp->data) { 3913 sctp_m_freem(sp->data); 3914 sp->data = NULL; 3915 sp->tail_mbuf = NULL; 3916 sp->length = 0; 3917 } 3918 } 3919 if (sp->net) { 3920 sctp_free_remote_addr(sp->net); 3921 sp->net = NULL; 3922 } 3923 /* Free the chunk */ 3924 sctp_free_a_strmoq(stcb, sp, so_locked); 3925 /* sa_ignore FREED_MEMORY */ 3926 } 3927 } 3928 3929 if (holds_lock == 0) { 3930 SCTP_TCB_SEND_UNLOCK(stcb); 3931 } 3932 } 3933 3934 void 3935 sctp_abort_notification(struct sctp_tcb *stcb, uint8_t from_peer, uint16_t error, 3936 struct sctp_abort_chunk *abort, int so_locked 3937 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3938 SCTP_UNUSED 3939 #endif 3940 ) 3941 { 3942 if (stcb == NULL) { 3943 return; 3944 } 3945 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || 3946 ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && 3947 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { 3948 stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED; 3949 } 3950 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3951 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3952 (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { 3953 return; 3954 } 3955 /* Tell them we lost the asoc */ 3956 sctp_report_all_outbound(stcb, error, 1, so_locked); 3957 if (from_peer) { 3958 sctp_ulp_notify(SCTP_NOTIFY_ASSOC_REM_ABORTED, stcb, error, abort, so_locked); 3959 } else { 3960 sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked); 3961 } 3962 } 3963 3964 void 3965 sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 3966 struct mbuf *m, int iphlen, 3967 struct sockaddr *src, struct sockaddr *dst, 3968 struct sctphdr *sh, struct mbuf *op_err, 3969 uint8_t mflowtype, uint32_t mflowid, 3970 uint32_t vrf_id, uint16_t port) 3971 { 3972 uint32_t vtag; 3973 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3974 struct socket *so; 3975 #endif 3976 3977 vtag = 0; 3978 if (stcb != NULL) { 3979 vtag = stcb->asoc.peer_vtag; 3980 vrf_id = stcb->asoc.vrf_id; 3981 } 3982 sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err, 3983 mflowtype, mflowid, inp->fibnum, 3984 vrf_id, port); 3985 if (stcb != NULL) { 3986 /* We have a TCB to abort, send notification too */ 3987 sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); 3988 stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; 3989 /* Ok, now lets free it */ 3990 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3991 so = SCTP_INP_SO(inp); 3992 atomic_add_int(&stcb->asoc.refcnt, 1); 3993 SCTP_TCB_UNLOCK(stcb); 3994 SCTP_SOCKET_LOCK(so, 1); 3995 SCTP_TCB_LOCK(stcb); 3996 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3997 #endif 3998 SCTP_STAT_INCR_COUNTER32(sctps_aborted); 3999 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || 4000 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { 4001 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 4002 } 4003 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 4004 SCTP_FROM_SCTPUTIL + SCTP_LOC_4); 4005 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4006 SCTP_SOCKET_UNLOCK(so, 1); 4007 #endif 4008 } 4009 } 4010 #ifdef SCTP_ASOCLOG_OF_TSNS 4011 void 4012 sctp_print_out_track_log(struct sctp_tcb *stcb) 4013 { 4014 #ifdef NOSIY_PRINTS 4015 int i; 4016 4017 SCTP_PRINTF("Last ep reason:%x\n", stcb->sctp_ep->last_abort_code); 4018 SCTP_PRINTF("IN bound TSN log-aaa\n"); 4019 if ((stcb->asoc.tsn_in_at == 0) && (stcb->asoc.tsn_in_wrapped == 0)) { 4020 SCTP_PRINTF("None rcvd\n"); 4021 goto none_in; 4022 } 4023 if (stcb->asoc.tsn_in_wrapped) { 4024 for (i = stcb->asoc.tsn_in_at; i < SCTP_TSN_LOG_SIZE; i++) { 4025 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4026 stcb->asoc.in_tsnlog[i].tsn, 4027 stcb->asoc.in_tsnlog[i].strm, 4028 stcb->asoc.in_tsnlog[i].seq, 4029 stcb->asoc.in_tsnlog[i].flgs, 4030 stcb->asoc.in_tsnlog[i].sz); 4031 } 4032 } 4033 if (stcb->asoc.tsn_in_at) { 4034 for (i = 0; i < stcb->asoc.tsn_in_at; i++) { 4035 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4036 stcb->asoc.in_tsnlog[i].tsn, 4037 stcb->asoc.in_tsnlog[i].strm, 4038 stcb->asoc.in_tsnlog[i].seq, 4039 stcb->asoc.in_tsnlog[i].flgs, 4040 stcb->asoc.in_tsnlog[i].sz); 4041 } 4042 } 4043 none_in: 4044 SCTP_PRINTF("OUT bound TSN log-aaa\n"); 4045 if ((stcb->asoc.tsn_out_at == 0) && 4046 (stcb->asoc.tsn_out_wrapped == 0)) { 4047 SCTP_PRINTF("None sent\n"); 4048 } 4049 if (stcb->asoc.tsn_out_wrapped) { 4050 for (i = stcb->asoc.tsn_out_at; i < SCTP_TSN_LOG_SIZE; i++) { 4051 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4052 stcb->asoc.out_tsnlog[i].tsn, 4053 stcb->asoc.out_tsnlog[i].strm, 4054 stcb->asoc.out_tsnlog[i].seq, 4055 stcb->asoc.out_tsnlog[i].flgs, 4056 stcb->asoc.out_tsnlog[i].sz); 4057 } 4058 } 4059 if (stcb->asoc.tsn_out_at) { 4060 for (i = 0; i < stcb->asoc.tsn_out_at; i++) { 4061 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4062 stcb->asoc.out_tsnlog[i].tsn, 4063 stcb->asoc.out_tsnlog[i].strm, 4064 stcb->asoc.out_tsnlog[i].seq, 4065 stcb->asoc.out_tsnlog[i].flgs, 4066 stcb->asoc.out_tsnlog[i].sz); 4067 } 4068 } 4069 #endif 4070 } 4071 #endif 4072 4073 void 4074 sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 4075 struct mbuf *op_err, 4076 int so_locked 4077 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4078 SCTP_UNUSED 4079 #endif 4080 ) 4081 { 4082 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4083 struct socket *so; 4084 #endif 4085 4086 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4087 so = SCTP_INP_SO(inp); 4088 #endif 4089 if (stcb == NULL) { 4090 /* Got to have a TCB */ 4091 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 4092 if (LIST_EMPTY(&inp->sctp_asoc_list)) { 4093 sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, 4094 SCTP_CALLED_DIRECTLY_NOCMPSET); 4095 } 4096 } 4097 return; 4098 } else { 4099 stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; 4100 } 4101 /* notify the peer */ 4102 sctp_send_abort_tcb(stcb, op_err, so_locked); 4103 SCTP_STAT_INCR_COUNTER32(sctps_aborted); 4104 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || 4105 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { 4106 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 4107 } 4108 /* notify the ulp */ 4109 if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { 4110 sctp_abort_notification(stcb, 0, 0, NULL, so_locked); 4111 } 4112 /* now free the asoc */ 4113 #ifdef SCTP_ASOCLOG_OF_TSNS 4114 sctp_print_out_track_log(stcb); 4115 #endif 4116 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4117 if (!so_locked) { 4118 atomic_add_int(&stcb->asoc.refcnt, 1); 4119 SCTP_TCB_UNLOCK(stcb); 4120 SCTP_SOCKET_LOCK(so, 1); 4121 SCTP_TCB_LOCK(stcb); 4122 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4123 } 4124 #endif 4125 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 4126 SCTP_FROM_SCTPUTIL + SCTP_LOC_5); 4127 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4128 if (!so_locked) { 4129 SCTP_SOCKET_UNLOCK(so, 1); 4130 } 4131 #endif 4132 } 4133 4134 void 4135 sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, 4136 struct sockaddr *src, struct sockaddr *dst, 4137 struct sctphdr *sh, struct sctp_inpcb *inp, 4138 struct mbuf *cause, 4139 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 4140 uint32_t vrf_id, uint16_t port) 4141 { 4142 struct sctp_chunkhdr *ch, chunk_buf; 4143 unsigned int chk_length; 4144 int contains_init_chunk; 4145 4146 SCTP_STAT_INCR_COUNTER32(sctps_outoftheblue); 4147 /* Generate a TO address for future reference */ 4148 if (inp && (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) { 4149 if (LIST_EMPTY(&inp->sctp_asoc_list)) { 4150 sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, 4151 SCTP_CALLED_DIRECTLY_NOCMPSET); 4152 } 4153 } 4154 contains_init_chunk = 0; 4155 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4156 sizeof(*ch), (uint8_t *)&chunk_buf); 4157 while (ch != NULL) { 4158 chk_length = ntohs(ch->chunk_length); 4159 if (chk_length < sizeof(*ch)) { 4160 /* break to abort land */ 4161 break; 4162 } 4163 switch (ch->chunk_type) { 4164 case SCTP_INIT: 4165 contains_init_chunk = 1; 4166 break; 4167 case SCTP_PACKET_DROPPED: 4168 /* we don't respond to pkt-dropped */ 4169 return; 4170 case SCTP_ABORT_ASSOCIATION: 4171 /* we don't respond with an ABORT to an ABORT */ 4172 return; 4173 case SCTP_SHUTDOWN_COMPLETE: 4174 /* 4175 * we ignore it since we are not waiting for it and 4176 * peer is gone 4177 */ 4178 return; 4179 case SCTP_SHUTDOWN_ACK: 4180 sctp_send_shutdown_complete2(src, dst, sh, 4181 mflowtype, mflowid, fibnum, 4182 vrf_id, port); 4183 return; 4184 default: 4185 break; 4186 } 4187 offset += SCTP_SIZE32(chk_length); 4188 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4189 sizeof(*ch), (uint8_t *)&chunk_buf); 4190 } 4191 if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || 4192 ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && 4193 (contains_init_chunk == 0))) { 4194 sctp_send_abort(m, iphlen, src, dst, sh, 0, cause, 4195 mflowtype, mflowid, fibnum, 4196 vrf_id, port); 4197 } 4198 } 4199 4200 /* 4201 * check the inbound datagram to make sure there is not an abort inside it, 4202 * if there is return 1, else return 0. 4203 */ 4204 int 4205 sctp_is_there_an_abort_here(struct mbuf *m, int iphlen, uint32_t *vtagfill) 4206 { 4207 struct sctp_chunkhdr *ch; 4208 struct sctp_init_chunk *init_chk, chunk_buf; 4209 int offset; 4210 unsigned int chk_length; 4211 4212 offset = iphlen + sizeof(struct sctphdr); 4213 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, sizeof(*ch), 4214 (uint8_t *)&chunk_buf); 4215 while (ch != NULL) { 4216 chk_length = ntohs(ch->chunk_length); 4217 if (chk_length < sizeof(*ch)) { 4218 /* packet is probably corrupt */ 4219 break; 4220 } 4221 /* we seem to be ok, is it an abort? */ 4222 if (ch->chunk_type == SCTP_ABORT_ASSOCIATION) { 4223 /* yep, tell them */ 4224 return (1); 4225 } 4226 if (ch->chunk_type == SCTP_INITIATION) { 4227 /* need to update the Vtag */ 4228 init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m, 4229 offset, sizeof(*init_chk), (uint8_t *)&chunk_buf); 4230 if (init_chk != NULL) { 4231 *vtagfill = ntohl(init_chk->init.initiate_tag); 4232 } 4233 } 4234 /* Nope, move to the next chunk */ 4235 offset += SCTP_SIZE32(chk_length); 4236 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4237 sizeof(*ch), (uint8_t *)&chunk_buf); 4238 } 4239 return (0); 4240 } 4241 4242 /* 4243 * currently (2/02), ifa_addr embeds scope_id's and don't have sin6_scope_id 4244 * set (i.e. it's 0) so, create this function to compare link local scopes 4245 */ 4246 #ifdef INET6 4247 uint32_t 4248 sctp_is_same_scope(struct sockaddr_in6 *addr1, struct sockaddr_in6 *addr2) 4249 { 4250 struct sockaddr_in6 a, b; 4251 4252 /* save copies */ 4253 a = *addr1; 4254 b = *addr2; 4255 4256 if (a.sin6_scope_id == 0) 4257 if (sa6_recoverscope(&a)) { 4258 /* can't get scope, so can't match */ 4259 return (0); 4260 } 4261 if (b.sin6_scope_id == 0) 4262 if (sa6_recoverscope(&b)) { 4263 /* can't get scope, so can't match */ 4264 return (0); 4265 } 4266 if (a.sin6_scope_id != b.sin6_scope_id) 4267 return (0); 4268 4269 return (1); 4270 } 4271 4272 /* 4273 * returns a sockaddr_in6 with embedded scope recovered and removed 4274 */ 4275 struct sockaddr_in6 * 4276 sctp_recover_scope(struct sockaddr_in6 *addr, struct sockaddr_in6 *store) 4277 { 4278 /* check and strip embedded scope junk */ 4279 if (addr->sin6_family == AF_INET6) { 4280 if (IN6_IS_SCOPE_LINKLOCAL(&addr->sin6_addr)) { 4281 if (addr->sin6_scope_id == 0) { 4282 *store = *addr; 4283 if (!sa6_recoverscope(store)) { 4284 /* use the recovered scope */ 4285 addr = store; 4286 } 4287 } else { 4288 /* else, return the original "to" addr */ 4289 in6_clearscope(&addr->sin6_addr); 4290 } 4291 } 4292 } 4293 return (addr); 4294 } 4295 #endif 4296 4297 /* 4298 * are the two addresses the same? currently a "scopeless" check returns: 1 4299 * if same, 0 if not 4300 */ 4301 int 4302 sctp_cmpaddr(struct sockaddr *sa1, struct sockaddr *sa2) 4303 { 4304 4305 /* must be valid */ 4306 if (sa1 == NULL || sa2 == NULL) 4307 return (0); 4308 4309 /* must be the same family */ 4310 if (sa1->sa_family != sa2->sa_family) 4311 return (0); 4312 4313 switch (sa1->sa_family) { 4314 #ifdef INET6 4315 case AF_INET6: 4316 { 4317 /* IPv6 addresses */ 4318 struct sockaddr_in6 *sin6_1, *sin6_2; 4319 4320 sin6_1 = (struct sockaddr_in6 *)sa1; 4321 sin6_2 = (struct sockaddr_in6 *)sa2; 4322 return (SCTP6_ARE_ADDR_EQUAL(sin6_1, 4323 sin6_2)); 4324 } 4325 #endif 4326 #ifdef INET 4327 case AF_INET: 4328 { 4329 /* IPv4 addresses */ 4330 struct sockaddr_in *sin_1, *sin_2; 4331 4332 sin_1 = (struct sockaddr_in *)sa1; 4333 sin_2 = (struct sockaddr_in *)sa2; 4334 return (sin_1->sin_addr.s_addr == sin_2->sin_addr.s_addr); 4335 } 4336 #endif 4337 default: 4338 /* we don't do these... */ 4339 return (0); 4340 } 4341 } 4342 4343 void 4344 sctp_print_address(struct sockaddr *sa) 4345 { 4346 #ifdef INET6 4347 char ip6buf[INET6_ADDRSTRLEN]; 4348 #endif 4349 4350 switch (sa->sa_family) { 4351 #ifdef INET6 4352 case AF_INET6: 4353 { 4354 struct sockaddr_in6 *sin6; 4355 4356 sin6 = (struct sockaddr_in6 *)sa; 4357 SCTP_PRINTF("IPv6 address: %s:port:%d scope:%u\n", 4358 ip6_sprintf(ip6buf, &sin6->sin6_addr), 4359 ntohs(sin6->sin6_port), 4360 sin6->sin6_scope_id); 4361 break; 4362 } 4363 #endif 4364 #ifdef INET 4365 case AF_INET: 4366 { 4367 struct sockaddr_in *sin; 4368 unsigned char *p; 4369 4370 sin = (struct sockaddr_in *)sa; 4371 p = (unsigned char *)&sin->sin_addr; 4372 SCTP_PRINTF("IPv4 address: %u.%u.%u.%u:%d\n", 4373 p[0], p[1], p[2], p[3], ntohs(sin->sin_port)); 4374 break; 4375 } 4376 #endif 4377 default: 4378 SCTP_PRINTF("?\n"); 4379 break; 4380 } 4381 } 4382 4383 void 4384 sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp, 4385 struct sctp_inpcb *new_inp, 4386 struct sctp_tcb *stcb, 4387 int waitflags) 4388 { 4389 /* 4390 * go through our old INP and pull off any control structures that 4391 * belong to stcb and move then to the new inp. 4392 */ 4393 struct socket *old_so, *new_so; 4394 struct sctp_queued_to_read *control, *nctl; 4395 struct sctp_readhead tmp_queue; 4396 struct mbuf *m; 4397 int error = 0; 4398 4399 old_so = old_inp->sctp_socket; 4400 new_so = new_inp->sctp_socket; 4401 TAILQ_INIT(&tmp_queue); 4402 error = sblock(&old_so->so_rcv, waitflags); 4403 if (error) { 4404 /* 4405 * Gak, can't get sblock, we have a problem. data will be 4406 * left stranded.. and we don't dare look at it since the 4407 * other thread may be reading something. Oh well, its a 4408 * screwed up app that does a peeloff OR a accept while 4409 * reading from the main socket... actually its only the 4410 * peeloff() case, since I think read will fail on a 4411 * listening socket.. 4412 */ 4413 return; 4414 } 4415 /* lock the socket buffers */ 4416 SCTP_INP_READ_LOCK(old_inp); 4417 TAILQ_FOREACH_SAFE(control, &old_inp->read_queue, next, nctl) { 4418 /* Pull off all for out target stcb */ 4419 if (control->stcb == stcb) { 4420 /* remove it we want it */ 4421 TAILQ_REMOVE(&old_inp->read_queue, control, next); 4422 TAILQ_INSERT_TAIL(&tmp_queue, control, next); 4423 m = control->data; 4424 while (m) { 4425 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4426 sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 4427 } 4428 sctp_sbfree(control, stcb, &old_so->so_rcv, m); 4429 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4430 sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4431 } 4432 m = SCTP_BUF_NEXT(m); 4433 } 4434 } 4435 } 4436 SCTP_INP_READ_UNLOCK(old_inp); 4437 /* Remove the sb-lock on the old socket */ 4438 4439 sbunlock(&old_so->so_rcv); 4440 /* Now we move them over to the new socket buffer */ 4441 SCTP_INP_READ_LOCK(new_inp); 4442 TAILQ_FOREACH_SAFE(control, &tmp_queue, next, nctl) { 4443 TAILQ_INSERT_TAIL(&new_inp->read_queue, control, next); 4444 m = control->data; 4445 while (m) { 4446 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4447 sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m)); 4448 } 4449 sctp_sballoc(stcb, &new_so->so_rcv, m); 4450 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4451 sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4452 } 4453 m = SCTP_BUF_NEXT(m); 4454 } 4455 } 4456 SCTP_INP_READ_UNLOCK(new_inp); 4457 } 4458 4459 void 4460 sctp_wakeup_the_read_socket(struct sctp_inpcb *inp, 4461 struct sctp_tcb *stcb, 4462 int so_locked 4463 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4464 SCTP_UNUSED 4465 #endif 4466 ) 4467 { 4468 if ((inp != NULL) && (inp->sctp_socket != NULL)) { 4469 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { 4470 SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket); 4471 } else { 4472 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4473 struct socket *so; 4474 4475 so = SCTP_INP_SO(inp); 4476 if (!so_locked) { 4477 if (stcb) { 4478 atomic_add_int(&stcb->asoc.refcnt, 1); 4479 SCTP_TCB_UNLOCK(stcb); 4480 } 4481 SCTP_SOCKET_LOCK(so, 1); 4482 if (stcb) { 4483 SCTP_TCB_LOCK(stcb); 4484 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4485 } 4486 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 4487 SCTP_SOCKET_UNLOCK(so, 1); 4488 return; 4489 } 4490 } 4491 #endif 4492 sctp_sorwakeup(inp, inp->sctp_socket); 4493 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4494 if (!so_locked) { 4495 SCTP_SOCKET_UNLOCK(so, 1); 4496 } 4497 #endif 4498 } 4499 } 4500 } 4501 4502 void 4503 sctp_add_to_readq(struct sctp_inpcb *inp, 4504 struct sctp_tcb *stcb, 4505 struct sctp_queued_to_read *control, 4506 struct sockbuf *sb, 4507 int end, 4508 int inp_read_lock_held, 4509 int so_locked 4510 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4511 SCTP_UNUSED 4512 #endif 4513 ) 4514 { 4515 /* 4516 * Here we must place the control on the end of the socket read 4517 * queue AND increment sb_cc so that select will work properly on 4518 * read. 4519 */ 4520 struct mbuf *m, *prev = NULL; 4521 4522 if (inp == NULL) { 4523 /* Gak, TSNH!! */ 4524 #ifdef INVARIANTS 4525 panic("Gak, inp NULL on add_to_readq"); 4526 #endif 4527 return; 4528 } 4529 if (inp_read_lock_held == 0) 4530 SCTP_INP_READ_LOCK(inp); 4531 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) { 4532 sctp_free_remote_addr(control->whoFrom); 4533 if (control->data) { 4534 sctp_m_freem(control->data); 4535 control->data = NULL; 4536 } 4537 sctp_free_a_readq(stcb, control); 4538 if (inp_read_lock_held == 0) 4539 SCTP_INP_READ_UNLOCK(inp); 4540 return; 4541 } 4542 if (!(control->spec_flags & M_NOTIFICATION)) { 4543 atomic_add_int(&inp->total_recvs, 1); 4544 if (!control->do_not_ref_stcb) { 4545 atomic_add_int(&stcb->total_recvs, 1); 4546 } 4547 } 4548 m = control->data; 4549 control->held_length = 0; 4550 control->length = 0; 4551 while (m) { 4552 if (SCTP_BUF_LEN(m) == 0) { 4553 /* Skip mbufs with NO length */ 4554 if (prev == NULL) { 4555 /* First one */ 4556 control->data = sctp_m_free(m); 4557 m = control->data; 4558 } else { 4559 SCTP_BUF_NEXT(prev) = sctp_m_free(m); 4560 m = SCTP_BUF_NEXT(prev); 4561 } 4562 if (m == NULL) { 4563 control->tail_mbuf = prev; 4564 } 4565 continue; 4566 } 4567 prev = m; 4568 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4569 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m)); 4570 } 4571 sctp_sballoc(stcb, sb, m); 4572 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4573 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4574 } 4575 atomic_add_int(&control->length, SCTP_BUF_LEN(m)); 4576 m = SCTP_BUF_NEXT(m); 4577 } 4578 if (prev != NULL) { 4579 control->tail_mbuf = prev; 4580 } else { 4581 /* Everything got collapsed out?? */ 4582 sctp_free_remote_addr(control->whoFrom); 4583 sctp_free_a_readq(stcb, control); 4584 if (inp_read_lock_held == 0) 4585 SCTP_INP_READ_UNLOCK(inp); 4586 return; 4587 } 4588 if (end) { 4589 control->end_added = 1; 4590 } 4591 TAILQ_INSERT_TAIL(&inp->read_queue, control, next); 4592 control->on_read_q = 1; 4593 if (inp_read_lock_held == 0) 4594 SCTP_INP_READ_UNLOCK(inp); 4595 if (inp && inp->sctp_socket) { 4596 sctp_wakeup_the_read_socket(inp, stcb, so_locked); 4597 } 4598 } 4599 4600 /*************HOLD THIS COMMENT FOR PATCH FILE OF 4601 *************ALTERNATE ROUTING CODE 4602 */ 4603 4604 /*************HOLD THIS COMMENT FOR END OF PATCH FILE OF 4605 *************ALTERNATE ROUTING CODE 4606 */ 4607 4608 struct mbuf * 4609 sctp_generate_cause(uint16_t code, char *info) 4610 { 4611 struct mbuf *m; 4612 struct sctp_gen_error_cause *cause; 4613 size_t info_len; 4614 uint16_t len; 4615 4616 if ((code == 0) || (info == NULL)) { 4617 return (NULL); 4618 } 4619 info_len = strlen(info); 4620 if (info_len > (SCTP_MAX_CAUSE_LENGTH - sizeof(struct sctp_paramhdr))) { 4621 return (NULL); 4622 } 4623 len = (uint16_t)(sizeof(struct sctp_paramhdr) + info_len); 4624 m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA); 4625 if (m != NULL) { 4626 SCTP_BUF_LEN(m) = len; 4627 cause = mtod(m, struct sctp_gen_error_cause *); 4628 cause->code = htons(code); 4629 cause->length = htons(len); 4630 memcpy(cause->info, info, info_len); 4631 } 4632 return (m); 4633 } 4634 4635 struct mbuf * 4636 sctp_generate_no_user_data_cause(uint32_t tsn) 4637 { 4638 struct mbuf *m; 4639 struct sctp_error_no_user_data *no_user_data_cause; 4640 uint16_t len; 4641 4642 len = (uint16_t)sizeof(struct sctp_error_no_user_data); 4643 m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA); 4644 if (m != NULL) { 4645 SCTP_BUF_LEN(m) = len; 4646 no_user_data_cause = mtod(m, struct sctp_error_no_user_data *); 4647 no_user_data_cause->cause.code = htons(SCTP_CAUSE_NO_USER_DATA); 4648 no_user_data_cause->cause.length = htons(len); 4649 no_user_data_cause->tsn = htonl(tsn); 4650 } 4651 return (m); 4652 } 4653 4654 #ifdef SCTP_MBCNT_LOGGING 4655 void 4656 sctp_free_bufspace(struct sctp_tcb *stcb, struct sctp_association *asoc, 4657 struct sctp_tmit_chunk *tp1, int chk_cnt) 4658 { 4659 if (tp1->data == NULL) { 4660 return; 4661 } 4662 asoc->chunks_on_out_queue -= chk_cnt; 4663 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBCNT_LOGGING_ENABLE) { 4664 sctp_log_mbcnt(SCTP_LOG_MBCNT_DECREASE, 4665 asoc->total_output_queue_size, 4666 tp1->book_size, 4667 0, 4668 tp1->mbcnt); 4669 } 4670 if (asoc->total_output_queue_size >= tp1->book_size) { 4671 atomic_add_int(&asoc->total_output_queue_size, -tp1->book_size); 4672 } else { 4673 asoc->total_output_queue_size = 0; 4674 } 4675 4676 if (stcb->sctp_socket && (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) || 4677 ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)))) { 4678 if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) { 4679 stcb->sctp_socket->so_snd.sb_cc -= tp1->book_size; 4680 } else { 4681 stcb->sctp_socket->so_snd.sb_cc = 0; 4682 4683 } 4684 } 4685 } 4686 4687 #endif 4688 4689 int 4690 sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, 4691 uint8_t sent, int so_locked 4692 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4693 SCTP_UNUSED 4694 #endif 4695 ) 4696 { 4697 struct sctp_stream_out *strq; 4698 struct sctp_tmit_chunk *chk = NULL, *tp2; 4699 struct sctp_stream_queue_pending *sp; 4700 uint32_t mid; 4701 uint16_t sid; 4702 uint8_t foundeom = 0; 4703 int ret_sz = 0; 4704 int notdone; 4705 int do_wakeup_routine = 0; 4706 4707 sid = tp1->rec.data.sid; 4708 mid = tp1->rec.data.mid; 4709 if (sent || !(tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG)) { 4710 stcb->asoc.abandoned_sent[0]++; 4711 stcb->asoc.abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++; 4712 stcb->asoc.strmout[sid].abandoned_sent[0]++; 4713 #if defined(SCTP_DETAILED_STR_STATS) 4714 stcb->asoc.strmout[stream].abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++; 4715 #endif 4716 } else { 4717 stcb->asoc.abandoned_unsent[0]++; 4718 stcb->asoc.abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++; 4719 stcb->asoc.strmout[sid].abandoned_unsent[0]++; 4720 #if defined(SCTP_DETAILED_STR_STATS) 4721 stcb->asoc.strmout[stream].abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++; 4722 #endif 4723 } 4724 do { 4725 ret_sz += tp1->book_size; 4726 if (tp1->data != NULL) { 4727 if (tp1->sent < SCTP_DATAGRAM_RESEND) { 4728 sctp_flight_size_decrease(tp1); 4729 sctp_total_flight_decrease(stcb, tp1); 4730 } 4731 sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); 4732 stcb->asoc.peers_rwnd += tp1->send_size; 4733 stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh); 4734 if (sent) { 4735 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); 4736 } else { 4737 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); 4738 } 4739 if (tp1->data) { 4740 sctp_m_freem(tp1->data); 4741 tp1->data = NULL; 4742 } 4743 do_wakeup_routine = 1; 4744 if (PR_SCTP_BUF_ENABLED(tp1->flags)) { 4745 stcb->asoc.sent_queue_cnt_removeable--; 4746 } 4747 } 4748 tp1->sent = SCTP_FORWARD_TSN_SKIP; 4749 if ((tp1->rec.data.rcv_flags & SCTP_DATA_NOT_FRAG) == 4750 SCTP_DATA_NOT_FRAG) { 4751 /* not frag'ed we ae done */ 4752 notdone = 0; 4753 foundeom = 1; 4754 } else if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { 4755 /* end of frag, we are done */ 4756 notdone = 0; 4757 foundeom = 1; 4758 } else { 4759 /* 4760 * Its a begin or middle piece, we must mark all of 4761 * it 4762 */ 4763 notdone = 1; 4764 tp1 = TAILQ_NEXT(tp1, sctp_next); 4765 } 4766 } while (tp1 && notdone); 4767 if (foundeom == 0) { 4768 /* 4769 * The multi-part message was scattered across the send and 4770 * sent queue. 4771 */ 4772 TAILQ_FOREACH_SAFE(tp1, &stcb->asoc.send_queue, sctp_next, tp2) { 4773 if ((tp1->rec.data.sid != sid) || 4774 (!SCTP_MID_EQ(stcb->asoc.idata_supported, tp1->rec.data.mid, mid))) { 4775 break; 4776 } 4777 /* 4778 * save to chk in case we have some on stream out 4779 * queue. If so and we have an un-transmitted one we 4780 * don't have to fudge the TSN. 4781 */ 4782 chk = tp1; 4783 ret_sz += tp1->book_size; 4784 sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); 4785 if (sent) { 4786 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); 4787 } else { 4788 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); 4789 } 4790 if (tp1->data) { 4791 sctp_m_freem(tp1->data); 4792 tp1->data = NULL; 4793 } 4794 /* No flight involved here book the size to 0 */ 4795 tp1->book_size = 0; 4796 if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { 4797 foundeom = 1; 4798 } 4799 do_wakeup_routine = 1; 4800 tp1->sent = SCTP_FORWARD_TSN_SKIP; 4801 TAILQ_REMOVE(&stcb->asoc.send_queue, tp1, sctp_next); 4802 /* 4803 * on to the sent queue so we can wait for it to be 4804 * passed by. 4805 */ 4806 TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, tp1, 4807 sctp_next); 4808 stcb->asoc.send_queue_cnt--; 4809 stcb->asoc.sent_queue_cnt++; 4810 } 4811 } 4812 if (foundeom == 0) { 4813 /* 4814 * Still no eom found. That means there is stuff left on the 4815 * stream out queue.. yuck. 4816 */ 4817 SCTP_TCB_SEND_LOCK(stcb); 4818 strq = &stcb->asoc.strmout[sid]; 4819 sp = TAILQ_FIRST(&strq->outqueue); 4820 if (sp != NULL) { 4821 sp->discard_rest = 1; 4822 /* 4823 * We may need to put a chunk on the queue that 4824 * holds the TSN that would have been sent with the 4825 * LAST bit. 4826 */ 4827 if (chk == NULL) { 4828 /* Yep, we have to */ 4829 sctp_alloc_a_chunk(stcb, chk); 4830 if (chk == NULL) { 4831 /* 4832 * we are hosed. All we can do is 4833 * nothing.. which will cause an 4834 * abort if the peer is paying 4835 * attention. 4836 */ 4837 goto oh_well; 4838 } 4839 memset(chk, 0, sizeof(*chk)); 4840 chk->rec.data.rcv_flags = 0; 4841 chk->sent = SCTP_FORWARD_TSN_SKIP; 4842 chk->asoc = &stcb->asoc; 4843 if (stcb->asoc.idata_supported == 0) { 4844 if (sp->sinfo_flags & SCTP_UNORDERED) { 4845 chk->rec.data.mid = 0; 4846 } else { 4847 chk->rec.data.mid = strq->next_mid_ordered; 4848 } 4849 } else { 4850 if (sp->sinfo_flags & SCTP_UNORDERED) { 4851 chk->rec.data.mid = strq->next_mid_unordered; 4852 } else { 4853 chk->rec.data.mid = strq->next_mid_ordered; 4854 } 4855 } 4856 chk->rec.data.sid = sp->sid; 4857 chk->rec.data.ppid = sp->ppid; 4858 chk->rec.data.context = sp->context; 4859 chk->flags = sp->act_flags; 4860 chk->whoTo = NULL; 4861 chk->rec.data.tsn = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1); 4862 strq->chunks_on_queues++; 4863 TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, chk, sctp_next); 4864 stcb->asoc.sent_queue_cnt++; 4865 stcb->asoc.pr_sctp_cnt++; 4866 } 4867 chk->rec.data.rcv_flags |= SCTP_DATA_LAST_FRAG; 4868 if (sp->sinfo_flags & SCTP_UNORDERED) { 4869 chk->rec.data.rcv_flags |= SCTP_DATA_UNORDERED; 4870 } 4871 if (stcb->asoc.idata_supported == 0) { 4872 if ((sp->sinfo_flags & SCTP_UNORDERED) == 0) { 4873 strq->next_mid_ordered++; 4874 } 4875 } else { 4876 if (sp->sinfo_flags & SCTP_UNORDERED) { 4877 strq->next_mid_unordered++; 4878 } else { 4879 strq->next_mid_ordered++; 4880 } 4881 } 4882 oh_well: 4883 if (sp->data) { 4884 /* 4885 * Pull any data to free up the SB and allow 4886 * sender to "add more" while we will throw 4887 * away :-) 4888 */ 4889 sctp_free_spbufspace(stcb, &stcb->asoc, sp); 4890 ret_sz += sp->length; 4891 do_wakeup_routine = 1; 4892 sp->some_taken = 1; 4893 sctp_m_freem(sp->data); 4894 sp->data = NULL; 4895 sp->tail_mbuf = NULL; 4896 sp->length = 0; 4897 } 4898 } 4899 SCTP_TCB_SEND_UNLOCK(stcb); 4900 } 4901 if (do_wakeup_routine) { 4902 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4903 struct socket *so; 4904 4905 so = SCTP_INP_SO(stcb->sctp_ep); 4906 if (!so_locked) { 4907 atomic_add_int(&stcb->asoc.refcnt, 1); 4908 SCTP_TCB_UNLOCK(stcb); 4909 SCTP_SOCKET_LOCK(so, 1); 4910 SCTP_TCB_LOCK(stcb); 4911 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4912 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 4913 /* assoc was freed while we were unlocked */ 4914 SCTP_SOCKET_UNLOCK(so, 1); 4915 return (ret_sz); 4916 } 4917 } 4918 #endif 4919 sctp_sowwakeup(stcb->sctp_ep, stcb->sctp_socket); 4920 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4921 if (!so_locked) { 4922 SCTP_SOCKET_UNLOCK(so, 1); 4923 } 4924 #endif 4925 } 4926 return (ret_sz); 4927 } 4928 4929 /* 4930 * checks to see if the given address, sa, is one that is currently known by 4931 * the kernel note: can't distinguish the same address on multiple interfaces 4932 * and doesn't handle multiple addresses with different zone/scope id's note: 4933 * ifa_ifwithaddr() compares the entire sockaddr struct 4934 */ 4935 struct sctp_ifa * 4936 sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, 4937 int holds_lock) 4938 { 4939 struct sctp_laddr *laddr; 4940 4941 if (holds_lock == 0) { 4942 SCTP_INP_RLOCK(inp); 4943 } 4944 LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 4945 if (laddr->ifa == NULL) 4946 continue; 4947 if (addr->sa_family != laddr->ifa->address.sa.sa_family) 4948 continue; 4949 #ifdef INET 4950 if (addr->sa_family == AF_INET) { 4951 if (((struct sockaddr_in *)addr)->sin_addr.s_addr == 4952 laddr->ifa->address.sin.sin_addr.s_addr) { 4953 /* found him. */ 4954 if (holds_lock == 0) { 4955 SCTP_INP_RUNLOCK(inp); 4956 } 4957 return (laddr->ifa); 4958 break; 4959 } 4960 } 4961 #endif 4962 #ifdef INET6 4963 if (addr->sa_family == AF_INET6) { 4964 if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr, 4965 &laddr->ifa->address.sin6)) { 4966 /* found him. */ 4967 if (holds_lock == 0) { 4968 SCTP_INP_RUNLOCK(inp); 4969 } 4970 return (laddr->ifa); 4971 break; 4972 } 4973 } 4974 #endif 4975 } 4976 if (holds_lock == 0) { 4977 SCTP_INP_RUNLOCK(inp); 4978 } 4979 return (NULL); 4980 } 4981 4982 uint32_t 4983 sctp_get_ifa_hash_val(struct sockaddr *addr) 4984 { 4985 switch (addr->sa_family) { 4986 #ifdef INET 4987 case AF_INET: 4988 { 4989 struct sockaddr_in *sin; 4990 4991 sin = (struct sockaddr_in *)addr; 4992 return (sin->sin_addr.s_addr ^ (sin->sin_addr.s_addr >> 16)); 4993 } 4994 #endif 4995 #ifdef INET6 4996 case AF_INET6: 4997 { 4998 struct sockaddr_in6 *sin6; 4999 uint32_t hash_of_addr; 5000 5001 sin6 = (struct sockaddr_in6 *)addr; 5002 hash_of_addr = (sin6->sin6_addr.s6_addr32[0] + 5003 sin6->sin6_addr.s6_addr32[1] + 5004 sin6->sin6_addr.s6_addr32[2] + 5005 sin6->sin6_addr.s6_addr32[3]); 5006 hash_of_addr = (hash_of_addr ^ (hash_of_addr >> 16)); 5007 return (hash_of_addr); 5008 } 5009 #endif 5010 default: 5011 break; 5012 } 5013 return (0); 5014 } 5015 5016 struct sctp_ifa * 5017 sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock) 5018 { 5019 struct sctp_ifa *sctp_ifap; 5020 struct sctp_vrf *vrf; 5021 struct sctp_ifalist *hash_head; 5022 uint32_t hash_of_addr; 5023 5024 if (holds_lock == 0) 5025 SCTP_IPI_ADDR_RLOCK(); 5026 5027 vrf = sctp_find_vrf(vrf_id); 5028 if (vrf == NULL) { 5029 if (holds_lock == 0) 5030 SCTP_IPI_ADDR_RUNLOCK(); 5031 return (NULL); 5032 } 5033 hash_of_addr = sctp_get_ifa_hash_val(addr); 5034 5035 hash_head = &vrf->vrf_addr_hash[(hash_of_addr & vrf->vrf_addr_hashmark)]; 5036 if (hash_head == NULL) { 5037 SCTP_PRINTF("hash_of_addr:%x mask:%x table:%x - ", 5038 hash_of_addr, (uint32_t)vrf->vrf_addr_hashmark, 5039 (uint32_t)(hash_of_addr & vrf->vrf_addr_hashmark)); 5040 sctp_print_address(addr); 5041 SCTP_PRINTF("No such bucket for address\n"); 5042 if (holds_lock == 0) 5043 SCTP_IPI_ADDR_RUNLOCK(); 5044 5045 return (NULL); 5046 } 5047 LIST_FOREACH(sctp_ifap, hash_head, next_bucket) { 5048 if (addr->sa_family != sctp_ifap->address.sa.sa_family) 5049 continue; 5050 #ifdef INET 5051 if (addr->sa_family == AF_INET) { 5052 if (((struct sockaddr_in *)addr)->sin_addr.s_addr == 5053 sctp_ifap->address.sin.sin_addr.s_addr) { 5054 /* found him. */ 5055 if (holds_lock == 0) 5056 SCTP_IPI_ADDR_RUNLOCK(); 5057 return (sctp_ifap); 5058 break; 5059 } 5060 } 5061 #endif 5062 #ifdef INET6 5063 if (addr->sa_family == AF_INET6) { 5064 if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr, 5065 &sctp_ifap->address.sin6)) { 5066 /* found him. */ 5067 if (holds_lock == 0) 5068 SCTP_IPI_ADDR_RUNLOCK(); 5069 return (sctp_ifap); 5070 break; 5071 } 5072 } 5073 #endif 5074 } 5075 if (holds_lock == 0) 5076 SCTP_IPI_ADDR_RUNLOCK(); 5077 return (NULL); 5078 } 5079 5080 static void 5081 sctp_user_rcvd(struct sctp_tcb *stcb, uint32_t *freed_so_far, int hold_rlock, 5082 uint32_t rwnd_req) 5083 { 5084 /* User pulled some data, do we need a rwnd update? */ 5085 int r_unlocked = 0; 5086 uint32_t dif, rwnd; 5087 struct socket *so = NULL; 5088 5089 if (stcb == NULL) 5090 return; 5091 5092 atomic_add_int(&stcb->asoc.refcnt, 1); 5093 5094 if (stcb->asoc.state & (SCTP_STATE_ABOUT_TO_BE_FREED | 5095 SCTP_STATE_SHUTDOWN_RECEIVED | 5096 SCTP_STATE_SHUTDOWN_ACK_SENT)) { 5097 /* Pre-check If we are freeing no update */ 5098 goto no_lock; 5099 } 5100 SCTP_INP_INCR_REF(stcb->sctp_ep); 5101 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 5102 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { 5103 goto out; 5104 } 5105 so = stcb->sctp_socket; 5106 if (so == NULL) { 5107 goto out; 5108 } 5109 atomic_add_int(&stcb->freed_by_sorcv_sincelast, *freed_so_far); 5110 /* Have you have freed enough to look */ 5111 *freed_so_far = 0; 5112 /* Yep, its worth a look and the lock overhead */ 5113 5114 /* Figure out what the rwnd would be */ 5115 rwnd = sctp_calc_rwnd(stcb, &stcb->asoc); 5116 if (rwnd >= stcb->asoc.my_last_reported_rwnd) { 5117 dif = rwnd - stcb->asoc.my_last_reported_rwnd; 5118 } else { 5119 dif = 0; 5120 } 5121 if (dif >= rwnd_req) { 5122 if (hold_rlock) { 5123 SCTP_INP_READ_UNLOCK(stcb->sctp_ep); 5124 r_unlocked = 1; 5125 } 5126 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5127 /* 5128 * One last check before we allow the guy possibly 5129 * to get in. There is a race, where the guy has not 5130 * reached the gate. In that case 5131 */ 5132 goto out; 5133 } 5134 SCTP_TCB_LOCK(stcb); 5135 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5136 /* No reports here */ 5137 SCTP_TCB_UNLOCK(stcb); 5138 goto out; 5139 } 5140 SCTP_STAT_INCR(sctps_wu_sacks_sent); 5141 sctp_send_sack(stcb, SCTP_SO_LOCKED); 5142 5143 sctp_chunk_output(stcb->sctp_ep, stcb, 5144 SCTP_OUTPUT_FROM_USR_RCVD, SCTP_SO_LOCKED); 5145 /* make sure no timer is running */ 5146 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, 5147 SCTP_FROM_SCTPUTIL + SCTP_LOC_6); 5148 SCTP_TCB_UNLOCK(stcb); 5149 } else { 5150 /* Update how much we have pending */ 5151 stcb->freed_by_sorcv_sincelast = dif; 5152 } 5153 out: 5154 if (so && r_unlocked && hold_rlock) { 5155 SCTP_INP_READ_LOCK(stcb->sctp_ep); 5156 } 5157 SCTP_INP_DECR_REF(stcb->sctp_ep); 5158 no_lock: 5159 atomic_add_int(&stcb->asoc.refcnt, -1); 5160 return; 5161 } 5162 5163 int 5164 sctp_sorecvmsg(struct socket *so, 5165 struct uio *uio, 5166 struct mbuf **mp, 5167 struct sockaddr *from, 5168 int fromlen, 5169 int *msg_flags, 5170 struct sctp_sndrcvinfo *sinfo, 5171 int filling_sinfo) 5172 { 5173 /* 5174 * MSG flags we will look at MSG_DONTWAIT - non-blocking IO. 5175 * MSG_PEEK - Look don't touch :-D (only valid with OUT mbuf copy 5176 * mp=NULL thus uio is the copy method to userland) MSG_WAITALL - ?? 5177 * On the way out we may send out any combination of: 5178 * MSG_NOTIFICATION MSG_EOR 5179 * 5180 */ 5181 struct sctp_inpcb *inp = NULL; 5182 int my_len = 0; 5183 int cp_len = 0, error = 0; 5184 struct sctp_queued_to_read *control = NULL, *ctl = NULL, *nxt = NULL; 5185 struct mbuf *m = NULL; 5186 struct sctp_tcb *stcb = NULL; 5187 int wakeup_read_socket = 0; 5188 int freecnt_applied = 0; 5189 int out_flags = 0, in_flags = 0; 5190 int block_allowed = 1; 5191 uint32_t freed_so_far = 0; 5192 uint32_t copied_so_far = 0; 5193 int in_eeor_mode = 0; 5194 int no_rcv_needed = 0; 5195 uint32_t rwnd_req = 0; 5196 int hold_sblock = 0; 5197 int hold_rlock = 0; 5198 ssize_t slen = 0; 5199 uint32_t held_length = 0; 5200 int sockbuf_lock = 0; 5201 5202 if (uio == NULL) { 5203 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 5204 return (EINVAL); 5205 } 5206 if (msg_flags) { 5207 in_flags = *msg_flags; 5208 if (in_flags & MSG_PEEK) 5209 SCTP_STAT_INCR(sctps_read_peeks); 5210 } else { 5211 in_flags = 0; 5212 } 5213 slen = uio->uio_resid; 5214 5215 /* Pull in and set up our int flags */ 5216 if (in_flags & MSG_OOB) { 5217 /* Out of band's NOT supported */ 5218 return (EOPNOTSUPP); 5219 } 5220 if ((in_flags & MSG_PEEK) && (mp != NULL)) { 5221 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 5222 return (EINVAL); 5223 } 5224 if ((in_flags & (MSG_DONTWAIT 5225 | MSG_NBIO 5226 )) || 5227 SCTP_SO_IS_NBIO(so)) { 5228 block_allowed = 0; 5229 } 5230 /* setup the endpoint */ 5231 inp = (struct sctp_inpcb *)so->so_pcb; 5232 if (inp == NULL) { 5233 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EFAULT); 5234 return (EFAULT); 5235 } 5236 rwnd_req = (SCTP_SB_LIMIT_RCV(so) >> SCTP_RWND_HIWAT_SHIFT); 5237 /* Must be at least a MTU's worth */ 5238 if (rwnd_req < SCTP_MIN_RWND) 5239 rwnd_req = SCTP_MIN_RWND; 5240 in_eeor_mode = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); 5241 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 5242 sctp_misc_ints(SCTP_SORECV_ENTER, 5243 rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); 5244 } 5245 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 5246 sctp_misc_ints(SCTP_SORECV_ENTERPL, 5247 rwnd_req, block_allowed, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); 5248 } 5249 error = sblock(&so->so_rcv, (block_allowed ? SBL_WAIT : 0)); 5250 if (error) { 5251 goto release_unlocked; 5252 } 5253 sockbuf_lock = 1; 5254 restart: 5255 5256 5257 restart_nosblocks: 5258 if (hold_sblock == 0) { 5259 SOCKBUF_LOCK(&so->so_rcv); 5260 hold_sblock = 1; 5261 } 5262 if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 5263 (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { 5264 goto out; 5265 } 5266 if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) { 5267 if (so->so_error) { 5268 error = so->so_error; 5269 if ((in_flags & MSG_PEEK) == 0) 5270 so->so_error = 0; 5271 goto out; 5272 } else { 5273 if (so->so_rcv.sb_cc == 0) { 5274 /* indicate EOF */ 5275 error = 0; 5276 goto out; 5277 } 5278 } 5279 } 5280 if (so->so_rcv.sb_cc <= held_length) { 5281 if (so->so_error) { 5282 error = so->so_error; 5283 if ((in_flags & MSG_PEEK) == 0) { 5284 so->so_error = 0; 5285 } 5286 goto out; 5287 } 5288 if ((so->so_rcv.sb_cc == 0) && 5289 ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 5290 (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { 5291 if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0) { 5292 /* 5293 * For active open side clear flags for 5294 * re-use passive open is blocked by 5295 * connect. 5296 */ 5297 if (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED) { 5298 /* 5299 * You were aborted, passive side 5300 * always hits here 5301 */ 5302 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); 5303 error = ECONNRESET; 5304 } 5305 so->so_state &= ~(SS_ISCONNECTING | 5306 SS_ISDISCONNECTING | 5307 SS_ISCONFIRMING | 5308 SS_ISCONNECTED); 5309 if (error == 0) { 5310 if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) == 0) { 5311 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN); 5312 error = ENOTCONN; 5313 } 5314 } 5315 goto out; 5316 } 5317 } 5318 if (block_allowed) { 5319 error = sbwait(&so->so_rcv); 5320 if (error) { 5321 goto out; 5322 } 5323 held_length = 0; 5324 goto restart_nosblocks; 5325 } else { 5326 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EWOULDBLOCK); 5327 error = EWOULDBLOCK; 5328 goto out; 5329 } 5330 } 5331 if (hold_sblock == 1) { 5332 SOCKBUF_UNLOCK(&so->so_rcv); 5333 hold_sblock = 0; 5334 } 5335 /* we possibly have data we can read */ 5336 /* sa_ignore FREED_MEMORY */ 5337 control = TAILQ_FIRST(&inp->read_queue); 5338 if (control == NULL) { 5339 /* 5340 * This could be happening since the appender did the 5341 * increment but as not yet did the tailq insert onto the 5342 * read_queue 5343 */ 5344 if (hold_rlock == 0) { 5345 SCTP_INP_READ_LOCK(inp); 5346 } 5347 control = TAILQ_FIRST(&inp->read_queue); 5348 if ((control == NULL) && (so->so_rcv.sb_cc != 0)) { 5349 #ifdef INVARIANTS 5350 panic("Huh, its non zero and nothing on control?"); 5351 #endif 5352 so->so_rcv.sb_cc = 0; 5353 } 5354 SCTP_INP_READ_UNLOCK(inp); 5355 hold_rlock = 0; 5356 goto restart; 5357 } 5358 if ((control->length == 0) && 5359 (control->do_not_ref_stcb)) { 5360 /* 5361 * Clean up code for freeing assoc that left behind a 5362 * pdapi.. maybe a peer in EEOR that just closed after 5363 * sending and never indicated a EOR. 5364 */ 5365 if (hold_rlock == 0) { 5366 hold_rlock = 1; 5367 SCTP_INP_READ_LOCK(inp); 5368 } 5369 control->held_length = 0; 5370 if (control->data) { 5371 /* Hmm there is data here .. fix */ 5372 struct mbuf *m_tmp; 5373 int cnt = 0; 5374 5375 m_tmp = control->data; 5376 while (m_tmp) { 5377 cnt += SCTP_BUF_LEN(m_tmp); 5378 if (SCTP_BUF_NEXT(m_tmp) == NULL) { 5379 control->tail_mbuf = m_tmp; 5380 control->end_added = 1; 5381 } 5382 m_tmp = SCTP_BUF_NEXT(m_tmp); 5383 } 5384 control->length = cnt; 5385 } else { 5386 /* remove it */ 5387 TAILQ_REMOVE(&inp->read_queue, control, next); 5388 /* Add back any hiddend data */ 5389 sctp_free_remote_addr(control->whoFrom); 5390 sctp_free_a_readq(stcb, control); 5391 } 5392 if (hold_rlock) { 5393 hold_rlock = 0; 5394 SCTP_INP_READ_UNLOCK(inp); 5395 } 5396 goto restart; 5397 } 5398 if ((control->length == 0) && 5399 (control->end_added == 1)) { 5400 /* 5401 * Do we also need to check for (control->pdapi_aborted == 5402 * 1)? 5403 */ 5404 if (hold_rlock == 0) { 5405 hold_rlock = 1; 5406 SCTP_INP_READ_LOCK(inp); 5407 } 5408 TAILQ_REMOVE(&inp->read_queue, control, next); 5409 if (control->data) { 5410 #ifdef INVARIANTS 5411 panic("control->data not null but control->length == 0"); 5412 #else 5413 SCTP_PRINTF("Strange, data left in the control buffer. Cleaning up.\n"); 5414 sctp_m_freem(control->data); 5415 control->data = NULL; 5416 #endif 5417 } 5418 if (control->aux_data) { 5419 sctp_m_free(control->aux_data); 5420 control->aux_data = NULL; 5421 } 5422 #ifdef INVARIANTS 5423 if (control->on_strm_q) { 5424 panic("About to free ctl:%p so:%p and its in %d", 5425 control, so, control->on_strm_q); 5426 } 5427 #endif 5428 sctp_free_remote_addr(control->whoFrom); 5429 sctp_free_a_readq(stcb, control); 5430 if (hold_rlock) { 5431 hold_rlock = 0; 5432 SCTP_INP_READ_UNLOCK(inp); 5433 } 5434 goto restart; 5435 } 5436 if (control->length == 0) { 5437 if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE)) && 5438 (filling_sinfo)) { 5439 /* find a more suitable one then this */ 5440 ctl = TAILQ_NEXT(control, next); 5441 while (ctl) { 5442 if ((ctl->stcb != control->stcb) && (ctl->length) && 5443 (ctl->some_taken || 5444 (ctl->spec_flags & M_NOTIFICATION) || 5445 ((ctl->do_not_ref_stcb == 0) && 5446 (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0))) 5447 ) { 5448 /*- 5449 * If we have a different TCB next, and there is data 5450 * present. If we have already taken some (pdapi), OR we can 5451 * ref the tcb and no delivery as started on this stream, we 5452 * take it. Note we allow a notification on a different 5453 * assoc to be delivered.. 5454 */ 5455 control = ctl; 5456 goto found_one; 5457 } else if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_INTERLEAVE_STRMS)) && 5458 (ctl->length) && 5459 ((ctl->some_taken) || 5460 ((ctl->do_not_ref_stcb == 0) && 5461 ((ctl->spec_flags & M_NOTIFICATION) == 0) && 5462 (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0)))) { 5463 /*- 5464 * If we have the same tcb, and there is data present, and we 5465 * have the strm interleave feature present. Then if we have 5466 * taken some (pdapi) or we can refer to tht tcb AND we have 5467 * not started a delivery for this stream, we can take it. 5468 * Note we do NOT allow a notificaiton on the same assoc to 5469 * be delivered. 5470 */ 5471 control = ctl; 5472 goto found_one; 5473 } 5474 ctl = TAILQ_NEXT(ctl, next); 5475 } 5476 } 5477 /* 5478 * if we reach here, not suitable replacement is available 5479 * <or> fragment interleave is NOT on. So stuff the sb_cc 5480 * into the our held count, and its time to sleep again. 5481 */ 5482 held_length = so->so_rcv.sb_cc; 5483 control->held_length = so->so_rcv.sb_cc; 5484 goto restart; 5485 } 5486 /* Clear the held length since there is something to read */ 5487 control->held_length = 0; 5488 found_one: 5489 /* 5490 * If we reach here, control has a some data for us to read off. 5491 * Note that stcb COULD be NULL. 5492 */ 5493 if (hold_rlock == 0) { 5494 hold_rlock = 1; 5495 SCTP_INP_READ_LOCK(inp); 5496 } 5497 control->some_taken++; 5498 stcb = control->stcb; 5499 if (stcb) { 5500 if ((control->do_not_ref_stcb == 0) && 5501 (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED)) { 5502 if (freecnt_applied == 0) 5503 stcb = NULL; 5504 } else if (control->do_not_ref_stcb == 0) { 5505 /* you can't free it on me please */ 5506 /* 5507 * The lock on the socket buffer protects us so the 5508 * free code will stop. But since we used the 5509 * socketbuf lock and the sender uses the tcb_lock 5510 * to increment, we need to use the atomic add to 5511 * the refcnt 5512 */ 5513 if (freecnt_applied) { 5514 #ifdef INVARIANTS 5515 panic("refcnt already incremented"); 5516 #else 5517 SCTP_PRINTF("refcnt already incremented?\n"); 5518 #endif 5519 } else { 5520 atomic_add_int(&stcb->asoc.refcnt, 1); 5521 freecnt_applied = 1; 5522 } 5523 /* 5524 * Setup to remember how much we have not yet told 5525 * the peer our rwnd has opened up. Note we grab the 5526 * value from the tcb from last time. Note too that 5527 * sack sending clears this when a sack is sent, 5528 * which is fine. Once we hit the rwnd_req, we then 5529 * will go to the sctp_user_rcvd() that will not 5530 * lock until it KNOWs it MUST send a WUP-SACK. 5531 */ 5532 freed_so_far = stcb->freed_by_sorcv_sincelast; 5533 stcb->freed_by_sorcv_sincelast = 0; 5534 } 5535 } 5536 if (stcb && 5537 ((control->spec_flags & M_NOTIFICATION) == 0) && 5538 control->do_not_ref_stcb == 0) { 5539 stcb->asoc.strmin[control->sinfo_stream].delivery_started = 1; 5540 } 5541 /* First lets get off the sinfo and sockaddr info */ 5542 if ((sinfo != NULL) && (filling_sinfo != 0)) { 5543 sinfo->sinfo_stream = control->sinfo_stream; 5544 sinfo->sinfo_ssn = (uint16_t)control->mid; 5545 sinfo->sinfo_flags = control->sinfo_flags; 5546 sinfo->sinfo_ppid = control->sinfo_ppid; 5547 sinfo->sinfo_context = control->sinfo_context; 5548 sinfo->sinfo_timetolive = control->sinfo_timetolive; 5549 sinfo->sinfo_tsn = control->sinfo_tsn; 5550 sinfo->sinfo_cumtsn = control->sinfo_cumtsn; 5551 sinfo->sinfo_assoc_id = control->sinfo_assoc_id; 5552 nxt = TAILQ_NEXT(control, next); 5553 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) || 5554 sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) { 5555 struct sctp_extrcvinfo *s_extra; 5556 5557 s_extra = (struct sctp_extrcvinfo *)sinfo; 5558 if ((nxt) && 5559 (nxt->length)) { 5560 s_extra->serinfo_next_flags = SCTP_NEXT_MSG_AVAIL; 5561 if (nxt->sinfo_flags & SCTP_UNORDERED) { 5562 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_UNORDERED; 5563 } 5564 if (nxt->spec_flags & M_NOTIFICATION) { 5565 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_NOTIFICATION; 5566 } 5567 s_extra->serinfo_next_aid = nxt->sinfo_assoc_id; 5568 s_extra->serinfo_next_length = nxt->length; 5569 s_extra->serinfo_next_ppid = nxt->sinfo_ppid; 5570 s_extra->serinfo_next_stream = nxt->sinfo_stream; 5571 if (nxt->tail_mbuf != NULL) { 5572 if (nxt->end_added) { 5573 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_ISCOMPLETE; 5574 } 5575 } 5576 } else { 5577 /* 5578 * we explicitly 0 this, since the memcpy 5579 * got some other things beyond the older 5580 * sinfo_ that is on the control's structure 5581 * :-D 5582 */ 5583 nxt = NULL; 5584 s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG; 5585 s_extra->serinfo_next_aid = 0; 5586 s_extra->serinfo_next_length = 0; 5587 s_extra->serinfo_next_ppid = 0; 5588 s_extra->serinfo_next_stream = 0; 5589 } 5590 } 5591 /* 5592 * update off the real current cum-ack, if we have an stcb. 5593 */ 5594 if ((control->do_not_ref_stcb == 0) && stcb) 5595 sinfo->sinfo_cumtsn = stcb->asoc.cumulative_tsn; 5596 /* 5597 * mask off the high bits, we keep the actual chunk bits in 5598 * there. 5599 */ 5600 sinfo->sinfo_flags &= 0x00ff; 5601 if ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) { 5602 sinfo->sinfo_flags |= SCTP_UNORDERED; 5603 } 5604 } 5605 #ifdef SCTP_ASOCLOG_OF_TSNS 5606 { 5607 int index, newindex; 5608 struct sctp_pcbtsn_rlog *entry; 5609 5610 do { 5611 index = inp->readlog_index; 5612 newindex = index + 1; 5613 if (newindex >= SCTP_READ_LOG_SIZE) { 5614 newindex = 0; 5615 } 5616 } while (atomic_cmpset_int(&inp->readlog_index, index, newindex) == 0); 5617 entry = &inp->readlog[index]; 5618 entry->vtag = control->sinfo_assoc_id; 5619 entry->strm = control->sinfo_stream; 5620 entry->seq = (uint16_t)control->mid; 5621 entry->sz = control->length; 5622 entry->flgs = control->sinfo_flags; 5623 } 5624 #endif 5625 if ((fromlen > 0) && (from != NULL)) { 5626 union sctp_sockstore store; 5627 size_t len; 5628 5629 switch (control->whoFrom->ro._l_addr.sa.sa_family) { 5630 #ifdef INET6 5631 case AF_INET6: 5632 len = sizeof(struct sockaddr_in6); 5633 store.sin6 = control->whoFrom->ro._l_addr.sin6; 5634 store.sin6.sin6_port = control->port_from; 5635 break; 5636 #endif 5637 #ifdef INET 5638 case AF_INET: 5639 #ifdef INET6 5640 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) { 5641 len = sizeof(struct sockaddr_in6); 5642 in6_sin_2_v4mapsin6(&control->whoFrom->ro._l_addr.sin, 5643 &store.sin6); 5644 store.sin6.sin6_port = control->port_from; 5645 } else { 5646 len = sizeof(struct sockaddr_in); 5647 store.sin = control->whoFrom->ro._l_addr.sin; 5648 store.sin.sin_port = control->port_from; 5649 } 5650 #else 5651 len = sizeof(struct sockaddr_in); 5652 store.sin = control->whoFrom->ro._l_addr.sin; 5653 store.sin.sin_port = control->port_from; 5654 #endif 5655 break; 5656 #endif 5657 default: 5658 len = 0; 5659 break; 5660 } 5661 memcpy(from, &store, min((size_t)fromlen, len)); 5662 #ifdef INET6 5663 { 5664 struct sockaddr_in6 lsa6, *from6; 5665 5666 from6 = (struct sockaddr_in6 *)from; 5667 sctp_recover_scope_mac(from6, (&lsa6)); 5668 } 5669 #endif 5670 } 5671 if (hold_rlock) { 5672 SCTP_INP_READ_UNLOCK(inp); 5673 hold_rlock = 0; 5674 } 5675 if (hold_sblock) { 5676 SOCKBUF_UNLOCK(&so->so_rcv); 5677 hold_sblock = 0; 5678 } 5679 /* now copy out what data we can */ 5680 if (mp == NULL) { 5681 /* copy out each mbuf in the chain up to length */ 5682 get_more_data: 5683 m = control->data; 5684 while (m) { 5685 /* Move out all we can */ 5686 cp_len = (int)uio->uio_resid; 5687 my_len = (int)SCTP_BUF_LEN(m); 5688 if (cp_len > my_len) { 5689 /* not enough in this buf */ 5690 cp_len = my_len; 5691 } 5692 if (hold_rlock) { 5693 SCTP_INP_READ_UNLOCK(inp); 5694 hold_rlock = 0; 5695 } 5696 if (cp_len > 0) 5697 error = uiomove(mtod(m, char *), cp_len, uio); 5698 /* re-read */ 5699 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 5700 goto release; 5701 } 5702 if ((control->do_not_ref_stcb == 0) && stcb && 5703 stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5704 no_rcv_needed = 1; 5705 } 5706 if (error) { 5707 /* error we are out of here */ 5708 goto release; 5709 } 5710 SCTP_INP_READ_LOCK(inp); 5711 hold_rlock = 1; 5712 if (cp_len == SCTP_BUF_LEN(m)) { 5713 if ((SCTP_BUF_NEXT(m) == NULL) && 5714 (control->end_added)) { 5715 out_flags |= MSG_EOR; 5716 if ((control->do_not_ref_stcb == 0) && 5717 (control->stcb != NULL) && 5718 ((control->spec_flags & M_NOTIFICATION) == 0)) 5719 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5720 } 5721 if (control->spec_flags & M_NOTIFICATION) { 5722 out_flags |= MSG_NOTIFICATION; 5723 } 5724 /* we ate up the mbuf */ 5725 if (in_flags & MSG_PEEK) { 5726 /* just looking */ 5727 m = SCTP_BUF_NEXT(m); 5728 copied_so_far += cp_len; 5729 } else { 5730 /* dispose of the mbuf */ 5731 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5732 sctp_sblog(&so->so_rcv, 5733 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 5734 } 5735 sctp_sbfree(control, stcb, &so->so_rcv, m); 5736 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5737 sctp_sblog(&so->so_rcv, 5738 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 5739 } 5740 copied_so_far += cp_len; 5741 freed_so_far += cp_len; 5742 freed_so_far += MSIZE; 5743 atomic_subtract_int(&control->length, cp_len); 5744 control->data = sctp_m_free(m); 5745 m = control->data; 5746 /* 5747 * been through it all, must hold sb 5748 * lock ok to null tail 5749 */ 5750 if (control->data == NULL) { 5751 #ifdef INVARIANTS 5752 if ((control->end_added == 0) || 5753 (TAILQ_NEXT(control, next) == NULL)) { 5754 /* 5755 * If the end is not 5756 * added, OR the 5757 * next is NOT null 5758 * we MUST have the 5759 * lock. 5760 */ 5761 if (mtx_owned(&inp->inp_rdata_mtx) == 0) { 5762 panic("Hmm we don't own the lock?"); 5763 } 5764 } 5765 #endif 5766 control->tail_mbuf = NULL; 5767 #ifdef INVARIANTS 5768 if ((control->end_added) && ((out_flags & MSG_EOR) == 0)) { 5769 panic("end_added, nothing left and no MSG_EOR"); 5770 } 5771 #endif 5772 } 5773 } 5774 } else { 5775 /* Do we need to trim the mbuf? */ 5776 if (control->spec_flags & M_NOTIFICATION) { 5777 out_flags |= MSG_NOTIFICATION; 5778 } 5779 if ((in_flags & MSG_PEEK) == 0) { 5780 SCTP_BUF_RESV_UF(m, cp_len); 5781 SCTP_BUF_LEN(m) -= cp_len; 5782 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5783 sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, cp_len); 5784 } 5785 atomic_subtract_int(&so->so_rcv.sb_cc, cp_len); 5786 if ((control->do_not_ref_stcb == 0) && 5787 stcb) { 5788 atomic_subtract_int(&stcb->asoc.sb_cc, cp_len); 5789 } 5790 copied_so_far += cp_len; 5791 freed_so_far += cp_len; 5792 freed_so_far += MSIZE; 5793 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5794 sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, 5795 SCTP_LOG_SBRESULT, 0); 5796 } 5797 atomic_subtract_int(&control->length, cp_len); 5798 } else { 5799 copied_so_far += cp_len; 5800 } 5801 } 5802 if ((out_flags & MSG_EOR) || (uio->uio_resid == 0)) { 5803 break; 5804 } 5805 if (((stcb) && (in_flags & MSG_PEEK) == 0) && 5806 (control->do_not_ref_stcb == 0) && 5807 (freed_so_far >= rwnd_req)) { 5808 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5809 } 5810 } /* end while(m) */ 5811 /* 5812 * At this point we have looked at it all and we either have 5813 * a MSG_EOR/or read all the user wants... <OR> 5814 * control->length == 0. 5815 */ 5816 if ((out_flags & MSG_EOR) && ((in_flags & MSG_PEEK) == 0)) { 5817 /* we are done with this control */ 5818 if (control->length == 0) { 5819 if (control->data) { 5820 #ifdef INVARIANTS 5821 panic("control->data not null at read eor?"); 5822 #else 5823 SCTP_PRINTF("Strange, data left in the control buffer .. invarients would panic?\n"); 5824 sctp_m_freem(control->data); 5825 control->data = NULL; 5826 #endif 5827 } 5828 done_with_control: 5829 if (hold_rlock == 0) { 5830 SCTP_INP_READ_LOCK(inp); 5831 hold_rlock = 1; 5832 } 5833 TAILQ_REMOVE(&inp->read_queue, control, next); 5834 /* Add back any hiddend data */ 5835 if (control->held_length) { 5836 held_length = 0; 5837 control->held_length = 0; 5838 wakeup_read_socket = 1; 5839 } 5840 if (control->aux_data) { 5841 sctp_m_free(control->aux_data); 5842 control->aux_data = NULL; 5843 } 5844 no_rcv_needed = control->do_not_ref_stcb; 5845 sctp_free_remote_addr(control->whoFrom); 5846 control->data = NULL; 5847 #ifdef INVARIANTS 5848 if (control->on_strm_q) { 5849 panic("About to free ctl:%p so:%p and its in %d", 5850 control, so, control->on_strm_q); 5851 } 5852 #endif 5853 sctp_free_a_readq(stcb, control); 5854 control = NULL; 5855 if ((freed_so_far >= rwnd_req) && 5856 (no_rcv_needed == 0)) 5857 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5858 5859 } else { 5860 /* 5861 * The user did not read all of this 5862 * message, turn off the returned MSG_EOR 5863 * since we are leaving more behind on the 5864 * control to read. 5865 */ 5866 #ifdef INVARIANTS 5867 if (control->end_added && 5868 (control->data == NULL) && 5869 (control->tail_mbuf == NULL)) { 5870 panic("Gak, control->length is corrupt?"); 5871 } 5872 #endif 5873 no_rcv_needed = control->do_not_ref_stcb; 5874 out_flags &= ~MSG_EOR; 5875 } 5876 } 5877 if (out_flags & MSG_EOR) { 5878 goto release; 5879 } 5880 if ((uio->uio_resid == 0) || 5881 ((in_eeor_mode) && 5882 (copied_so_far >= (uint32_t)max(so->so_rcv.sb_lowat, 1)))) { 5883 goto release; 5884 } 5885 /* 5886 * If I hit here the receiver wants more and this message is 5887 * NOT done (pd-api). So two questions. Can we block? if not 5888 * we are done. Did the user NOT set MSG_WAITALL? 5889 */ 5890 if (block_allowed == 0) { 5891 goto release; 5892 } 5893 /* 5894 * We need to wait for more data a few things: - We don't 5895 * sbunlock() so we don't get someone else reading. - We 5896 * must be sure to account for the case where what is added 5897 * is NOT to our control when we wakeup. 5898 */ 5899 5900 /* 5901 * Do we need to tell the transport a rwnd update might be 5902 * needed before we go to sleep? 5903 */ 5904 if (((stcb) && (in_flags & MSG_PEEK) == 0) && 5905 ((freed_so_far >= rwnd_req) && 5906 (control->do_not_ref_stcb == 0) && 5907 (no_rcv_needed == 0))) { 5908 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5909 } 5910 wait_some_more: 5911 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) { 5912 goto release; 5913 } 5914 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) 5915 goto release; 5916 5917 if (hold_rlock == 1) { 5918 SCTP_INP_READ_UNLOCK(inp); 5919 hold_rlock = 0; 5920 } 5921 if (hold_sblock == 0) { 5922 SOCKBUF_LOCK(&so->so_rcv); 5923 hold_sblock = 1; 5924 } 5925 if ((copied_so_far) && (control->length == 0) && 5926 (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE))) { 5927 goto release; 5928 } 5929 if (so->so_rcv.sb_cc <= control->held_length) { 5930 error = sbwait(&so->so_rcv); 5931 if (error) { 5932 goto release; 5933 } 5934 control->held_length = 0; 5935 } 5936 if (hold_sblock) { 5937 SOCKBUF_UNLOCK(&so->so_rcv); 5938 hold_sblock = 0; 5939 } 5940 if (control->length == 0) { 5941 /* still nothing here */ 5942 if (control->end_added == 1) { 5943 /* he aborted, or is done i.e.did a shutdown */ 5944 out_flags |= MSG_EOR; 5945 if (control->pdapi_aborted) { 5946 if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0)) 5947 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5948 5949 out_flags |= MSG_TRUNC; 5950 } else { 5951 if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0)) 5952 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5953 } 5954 goto done_with_control; 5955 } 5956 if (so->so_rcv.sb_cc > held_length) { 5957 control->held_length = so->so_rcv.sb_cc; 5958 held_length = 0; 5959 } 5960 goto wait_some_more; 5961 } else if (control->data == NULL) { 5962 /* 5963 * we must re-sync since data is probably being 5964 * added 5965 */ 5966 SCTP_INP_READ_LOCK(inp); 5967 if ((control->length > 0) && (control->data == NULL)) { 5968 /* 5969 * big trouble.. we have the lock and its 5970 * corrupt? 5971 */ 5972 #ifdef INVARIANTS 5973 panic("Impossible data==NULL length !=0"); 5974 #endif 5975 out_flags |= MSG_EOR; 5976 out_flags |= MSG_TRUNC; 5977 control->length = 0; 5978 SCTP_INP_READ_UNLOCK(inp); 5979 goto done_with_control; 5980 } 5981 SCTP_INP_READ_UNLOCK(inp); 5982 /* We will fall around to get more data */ 5983 } 5984 goto get_more_data; 5985 } else { 5986 /*- 5987 * Give caller back the mbuf chain, 5988 * store in uio_resid the length 5989 */ 5990 wakeup_read_socket = 0; 5991 if ((control->end_added == 0) || 5992 (TAILQ_NEXT(control, next) == NULL)) { 5993 /* Need to get rlock */ 5994 if (hold_rlock == 0) { 5995 SCTP_INP_READ_LOCK(inp); 5996 hold_rlock = 1; 5997 } 5998 } 5999 if (control->end_added) { 6000 out_flags |= MSG_EOR; 6001 if ((control->do_not_ref_stcb == 0) && 6002 (control->stcb != NULL) && 6003 ((control->spec_flags & M_NOTIFICATION) == 0)) 6004 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 6005 } 6006 if (control->spec_flags & M_NOTIFICATION) { 6007 out_flags |= MSG_NOTIFICATION; 6008 } 6009 uio->uio_resid = control->length; 6010 *mp = control->data; 6011 m = control->data; 6012 while (m) { 6013 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 6014 sctp_sblog(&so->so_rcv, 6015 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 6016 } 6017 sctp_sbfree(control, stcb, &so->so_rcv, m); 6018 freed_so_far += SCTP_BUF_LEN(m); 6019 freed_so_far += MSIZE; 6020 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 6021 sctp_sblog(&so->so_rcv, 6022 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 6023 } 6024 m = SCTP_BUF_NEXT(m); 6025 } 6026 control->data = control->tail_mbuf = NULL; 6027 control->length = 0; 6028 if (out_flags & MSG_EOR) { 6029 /* Done with this control */ 6030 goto done_with_control; 6031 } 6032 } 6033 release: 6034 if (hold_rlock == 1) { 6035 SCTP_INP_READ_UNLOCK(inp); 6036 hold_rlock = 0; 6037 } 6038 if (hold_sblock == 1) { 6039 SOCKBUF_UNLOCK(&so->so_rcv); 6040 hold_sblock = 0; 6041 } 6042 sbunlock(&so->so_rcv); 6043 sockbuf_lock = 0; 6044 6045 release_unlocked: 6046 if (hold_sblock) { 6047 SOCKBUF_UNLOCK(&so->so_rcv); 6048 hold_sblock = 0; 6049 } 6050 if ((stcb) && (in_flags & MSG_PEEK) == 0) { 6051 if ((freed_so_far >= rwnd_req) && 6052 (control && (control->do_not_ref_stcb == 0)) && 6053 (no_rcv_needed == 0)) 6054 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 6055 } 6056 out: 6057 if (msg_flags) { 6058 *msg_flags = out_flags; 6059 } 6060 if (((out_flags & MSG_EOR) == 0) && 6061 ((in_flags & MSG_PEEK) == 0) && 6062 (sinfo) && 6063 (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) || 6064 sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO))) { 6065 struct sctp_extrcvinfo *s_extra; 6066 6067 s_extra = (struct sctp_extrcvinfo *)sinfo; 6068 s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG; 6069 } 6070 if (hold_rlock == 1) { 6071 SCTP_INP_READ_UNLOCK(inp); 6072 } 6073 if (hold_sblock) { 6074 SOCKBUF_UNLOCK(&so->so_rcv); 6075 } 6076 if (sockbuf_lock) { 6077 sbunlock(&so->so_rcv); 6078 } 6079 if (freecnt_applied) { 6080 /* 6081 * The lock on the socket buffer protects us so the free 6082 * code will stop. But since we used the socketbuf lock and 6083 * the sender uses the tcb_lock to increment, we need to use 6084 * the atomic add to the refcnt. 6085 */ 6086 if (stcb == NULL) { 6087 #ifdef INVARIANTS 6088 panic("stcb for refcnt has gone NULL?"); 6089 goto stage_left; 6090 #else 6091 goto stage_left; 6092 #endif 6093 } 6094 /* Save the value back for next time */ 6095 stcb->freed_by_sorcv_sincelast = freed_so_far; 6096 atomic_add_int(&stcb->asoc.refcnt, -1); 6097 } 6098 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 6099 if (stcb) { 6100 sctp_misc_ints(SCTP_SORECV_DONE, 6101 freed_so_far, 6102 (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), 6103 stcb->asoc.my_rwnd, 6104 so->so_rcv.sb_cc); 6105 } else { 6106 sctp_misc_ints(SCTP_SORECV_DONE, 6107 freed_so_far, 6108 (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), 6109 0, 6110 so->so_rcv.sb_cc); 6111 } 6112 } 6113 stage_left: 6114 if (wakeup_read_socket) { 6115 sctp_sorwakeup(inp, so); 6116 } 6117 return (error); 6118 } 6119 6120 6121 #ifdef SCTP_MBUF_LOGGING 6122 struct mbuf * 6123 sctp_m_free(struct mbuf *m) 6124 { 6125 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 6126 sctp_log_mb(m, SCTP_MBUF_IFREE); 6127 } 6128 return (m_free(m)); 6129 } 6130 6131 void 6132 sctp_m_freem(struct mbuf *mb) 6133 { 6134 while (mb != NULL) 6135 mb = sctp_m_free(mb); 6136 } 6137 6138 #endif 6139 6140 int 6141 sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id) 6142 { 6143 /* 6144 * Given a local address. For all associations that holds the 6145 * address, request a peer-set-primary. 6146 */ 6147 struct sctp_ifa *ifa; 6148 struct sctp_laddr *wi; 6149 6150 ifa = sctp_find_ifa_by_addr(sa, vrf_id, 0); 6151 if (ifa == NULL) { 6152 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EADDRNOTAVAIL); 6153 return (EADDRNOTAVAIL); 6154 } 6155 /* 6156 * Now that we have the ifa we must awaken the iterator with this 6157 * message. 6158 */ 6159 wi = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_laddr), struct sctp_laddr); 6160 if (wi == NULL) { 6161 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); 6162 return (ENOMEM); 6163 } 6164 /* Now incr the count and int wi structure */ 6165 SCTP_INCR_LADDR_COUNT(); 6166 bzero(wi, sizeof(*wi)); 6167 (void)SCTP_GETTIME_TIMEVAL(&wi->start_time); 6168 wi->ifa = ifa; 6169 wi->action = SCTP_SET_PRIM_ADDR; 6170 atomic_add_int(&ifa->refcount, 1); 6171 6172 /* Now add it to the work queue */ 6173 SCTP_WQ_ADDR_LOCK(); 6174 /* 6175 * Should this really be a tailq? As it is we will process the 6176 * newest first :-0 6177 */ 6178 LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr); 6179 SCTP_WQ_ADDR_UNLOCK(); 6180 sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ, 6181 (struct sctp_inpcb *)NULL, 6182 (struct sctp_tcb *)NULL, 6183 (struct sctp_nets *)NULL); 6184 return (0); 6185 } 6186 6187 6188 int 6189 sctp_soreceive(struct socket *so, 6190 struct sockaddr **psa, 6191 struct uio *uio, 6192 struct mbuf **mp0, 6193 struct mbuf **controlp, 6194 int *flagsp) 6195 { 6196 int error, fromlen; 6197 uint8_t sockbuf[256]; 6198 struct sockaddr *from; 6199 struct sctp_extrcvinfo sinfo; 6200 int filling_sinfo = 1; 6201 struct sctp_inpcb *inp; 6202 6203 inp = (struct sctp_inpcb *)so->so_pcb; 6204 /* pickup the assoc we are reading from */ 6205 if (inp == NULL) { 6206 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6207 return (EINVAL); 6208 } 6209 if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT) && 6210 sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVRCVINFO) && 6211 sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) || 6212 (controlp == NULL)) { 6213 /* user does not want the sndrcv ctl */ 6214 filling_sinfo = 0; 6215 } 6216 if (psa) { 6217 from = (struct sockaddr *)sockbuf; 6218 fromlen = sizeof(sockbuf); 6219 from->sa_len = 0; 6220 } else { 6221 from = NULL; 6222 fromlen = 0; 6223 } 6224 6225 if (filling_sinfo) { 6226 memset(&sinfo, 0, sizeof(struct sctp_extrcvinfo)); 6227 } 6228 error = sctp_sorecvmsg(so, uio, mp0, from, fromlen, flagsp, 6229 (struct sctp_sndrcvinfo *)&sinfo, filling_sinfo); 6230 if (controlp != NULL) { 6231 /* copy back the sinfo in a CMSG format */ 6232 if (filling_sinfo) 6233 *controlp = sctp_build_ctl_nchunk(inp, 6234 (struct sctp_sndrcvinfo *)&sinfo); 6235 else 6236 *controlp = NULL; 6237 } 6238 if (psa) { 6239 /* copy back the address info */ 6240 if (from && from->sa_len) { 6241 *psa = sodupsockaddr(from, M_NOWAIT); 6242 } else { 6243 *psa = NULL; 6244 } 6245 } 6246 return (error); 6247 } 6248 6249 6250 6251 6252 6253 int 6254 sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, 6255 int totaddr, int *error) 6256 { 6257 int added = 0; 6258 int i; 6259 struct sctp_inpcb *inp; 6260 struct sockaddr *sa; 6261 size_t incr = 0; 6262 #ifdef INET 6263 struct sockaddr_in *sin; 6264 #endif 6265 #ifdef INET6 6266 struct sockaddr_in6 *sin6; 6267 #endif 6268 6269 sa = addr; 6270 inp = stcb->sctp_ep; 6271 *error = 0; 6272 for (i = 0; i < totaddr; i++) { 6273 switch (sa->sa_family) { 6274 #ifdef INET 6275 case AF_INET: 6276 incr = sizeof(struct sockaddr_in); 6277 sin = (struct sockaddr_in *)sa; 6278 if ((sin->sin_addr.s_addr == INADDR_ANY) || 6279 (sin->sin_addr.s_addr == INADDR_BROADCAST) || 6280 IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { 6281 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6282 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6283 SCTP_FROM_SCTPUTIL + SCTP_LOC_7); 6284 *error = EINVAL; 6285 goto out_now; 6286 } 6287 if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port, 6288 SCTP_DONOT_SETSCOPE, 6289 SCTP_ADDR_IS_CONFIRMED)) { 6290 /* assoc gone no un-lock */ 6291 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); 6292 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6293 SCTP_FROM_SCTPUTIL + SCTP_LOC_8); 6294 *error = ENOBUFS; 6295 goto out_now; 6296 } 6297 added++; 6298 break; 6299 #endif 6300 #ifdef INET6 6301 case AF_INET6: 6302 incr = sizeof(struct sockaddr_in6); 6303 sin6 = (struct sockaddr_in6 *)sa; 6304 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) || 6305 IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { 6306 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6307 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6308 SCTP_FROM_SCTPUTIL + SCTP_LOC_9); 6309 *error = EINVAL; 6310 goto out_now; 6311 } 6312 if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port, 6313 SCTP_DONOT_SETSCOPE, 6314 SCTP_ADDR_IS_CONFIRMED)) { 6315 /* assoc gone no un-lock */ 6316 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); 6317 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6318 SCTP_FROM_SCTPUTIL + SCTP_LOC_10); 6319 *error = ENOBUFS; 6320 goto out_now; 6321 } 6322 added++; 6323 break; 6324 #endif 6325 default: 6326 break; 6327 } 6328 sa = (struct sockaddr *)((caddr_t)sa + incr); 6329 } 6330 out_now: 6331 return (added); 6332 } 6333 6334 struct sctp_tcb * 6335 sctp_connectx_helper_find(struct sctp_inpcb *inp, struct sockaddr *addr, 6336 unsigned int *totaddr, 6337 unsigned int *num_v4, unsigned int *num_v6, int *error, 6338 unsigned int limit, int *bad_addr) 6339 { 6340 struct sockaddr *sa; 6341 struct sctp_tcb *stcb = NULL; 6342 unsigned int incr, at, i; 6343 6344 at = 0; 6345 sa = addr; 6346 *error = *num_v6 = *num_v4 = 0; 6347 /* account and validate addresses */ 6348 for (i = 0; i < *totaddr; i++) { 6349 switch (sa->sa_family) { 6350 #ifdef INET 6351 case AF_INET: 6352 incr = (unsigned int)sizeof(struct sockaddr_in); 6353 if (sa->sa_len != incr) { 6354 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6355 *error = EINVAL; 6356 *bad_addr = 1; 6357 return (NULL); 6358 } 6359 (*num_v4) += 1; 6360 break; 6361 #endif 6362 #ifdef INET6 6363 case AF_INET6: 6364 { 6365 struct sockaddr_in6 *sin6; 6366 6367 sin6 = (struct sockaddr_in6 *)sa; 6368 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6369 /* Must be non-mapped for connectx */ 6370 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6371 *error = EINVAL; 6372 *bad_addr = 1; 6373 return (NULL); 6374 } 6375 incr = (unsigned int)sizeof(struct sockaddr_in6); 6376 if (sa->sa_len != incr) { 6377 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6378 *error = EINVAL; 6379 *bad_addr = 1; 6380 return (NULL); 6381 } 6382 (*num_v6) += 1; 6383 break; 6384 } 6385 #endif 6386 default: 6387 *totaddr = i; 6388 incr = 0; 6389 /* we are done */ 6390 break; 6391 } 6392 if (i == *totaddr) { 6393 break; 6394 } 6395 SCTP_INP_INCR_REF(inp); 6396 stcb = sctp_findassociation_ep_addr(&inp, sa, NULL, NULL, NULL); 6397 if (stcb != NULL) { 6398 /* Already have or am bring up an association */ 6399 return (stcb); 6400 } else { 6401 SCTP_INP_DECR_REF(inp); 6402 } 6403 if ((at + incr) > limit) { 6404 *totaddr = i; 6405 break; 6406 } 6407 sa = (struct sockaddr *)((caddr_t)sa + incr); 6408 } 6409 return ((struct sctp_tcb *)NULL); 6410 } 6411 6412 /* 6413 * sctp_bindx(ADD) for one address. 6414 * assumes all arguments are valid/checked by caller. 6415 */ 6416 void 6417 sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, 6418 struct sockaddr *sa, sctp_assoc_t assoc_id, 6419 uint32_t vrf_id, int *error, void *p) 6420 { 6421 struct sockaddr *addr_touse; 6422 #if defined(INET) && defined(INET6) 6423 struct sockaddr_in sin; 6424 #endif 6425 6426 /* see if we're bound all already! */ 6427 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6428 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6429 *error = EINVAL; 6430 return; 6431 } 6432 addr_touse = sa; 6433 #ifdef INET6 6434 if (sa->sa_family == AF_INET6) { 6435 #ifdef INET 6436 struct sockaddr_in6 *sin6; 6437 6438 #endif 6439 if (sa->sa_len != sizeof(struct sockaddr_in6)) { 6440 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6441 *error = EINVAL; 6442 return; 6443 } 6444 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { 6445 /* can only bind v6 on PF_INET6 sockets */ 6446 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6447 *error = EINVAL; 6448 return; 6449 } 6450 #ifdef INET 6451 sin6 = (struct sockaddr_in6 *)addr_touse; 6452 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6453 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6454 SCTP_IPV6_V6ONLY(inp)) { 6455 /* can't bind v4-mapped on PF_INET sockets */ 6456 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6457 *error = EINVAL; 6458 return; 6459 } 6460 in6_sin6_2_sin(&sin, sin6); 6461 addr_touse = (struct sockaddr *)&sin; 6462 } 6463 #endif 6464 } 6465 #endif 6466 #ifdef INET 6467 if (sa->sa_family == AF_INET) { 6468 if (sa->sa_len != sizeof(struct sockaddr_in)) { 6469 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6470 *error = EINVAL; 6471 return; 6472 } 6473 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6474 SCTP_IPV6_V6ONLY(inp)) { 6475 /* can't bind v4 on PF_INET sockets */ 6476 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6477 *error = EINVAL; 6478 return; 6479 } 6480 } 6481 #endif 6482 if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { 6483 if (p == NULL) { 6484 /* Can't get proc for Net/Open BSD */ 6485 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6486 *error = EINVAL; 6487 return; 6488 } 6489 *error = sctp_inpcb_bind(so, addr_touse, NULL, p); 6490 return; 6491 } 6492 /* 6493 * No locks required here since bind and mgmt_ep_sa all do their own 6494 * locking. If we do something for the FIX: below we may need to 6495 * lock in that case. 6496 */ 6497 if (assoc_id == 0) { 6498 /* add the address */ 6499 struct sctp_inpcb *lep; 6500 struct sockaddr_in *lsin = (struct sockaddr_in *)addr_touse; 6501 6502 /* validate the incoming port */ 6503 if ((lsin->sin_port != 0) && 6504 (lsin->sin_port != inp->sctp_lport)) { 6505 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6506 *error = EINVAL; 6507 return; 6508 } else { 6509 /* user specified 0 port, set it to existing port */ 6510 lsin->sin_port = inp->sctp_lport; 6511 } 6512 6513 lep = sctp_pcb_findep(addr_touse, 1, 0, vrf_id); 6514 if (lep != NULL) { 6515 /* 6516 * We must decrement the refcount since we have the 6517 * ep already and are binding. No remove going on 6518 * here. 6519 */ 6520 SCTP_INP_DECR_REF(lep); 6521 } 6522 if (lep == inp) { 6523 /* already bound to it.. ok */ 6524 return; 6525 } else if (lep == NULL) { 6526 ((struct sockaddr_in *)addr_touse)->sin_port = 0; 6527 *error = sctp_addr_mgmt_ep_sa(inp, addr_touse, 6528 SCTP_ADD_IP_ADDRESS, 6529 vrf_id, NULL); 6530 } else { 6531 *error = EADDRINUSE; 6532 } 6533 if (*error) 6534 return; 6535 } else { 6536 /* 6537 * FIX: decide whether we allow assoc based bindx 6538 */ 6539 } 6540 } 6541 6542 /* 6543 * sctp_bindx(DELETE) for one address. 6544 * assumes all arguments are valid/checked by caller. 6545 */ 6546 void 6547 sctp_bindx_delete_address(struct sctp_inpcb *inp, 6548 struct sockaddr *sa, sctp_assoc_t assoc_id, 6549 uint32_t vrf_id, int *error) 6550 { 6551 struct sockaddr *addr_touse; 6552 #if defined(INET) && defined(INET6) 6553 struct sockaddr_in sin; 6554 #endif 6555 6556 /* see if we're bound all already! */ 6557 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6558 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6559 *error = EINVAL; 6560 return; 6561 } 6562 addr_touse = sa; 6563 #ifdef INET6 6564 if (sa->sa_family == AF_INET6) { 6565 #ifdef INET 6566 struct sockaddr_in6 *sin6; 6567 #endif 6568 6569 if (sa->sa_len != sizeof(struct sockaddr_in6)) { 6570 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6571 *error = EINVAL; 6572 return; 6573 } 6574 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { 6575 /* can only bind v6 on PF_INET6 sockets */ 6576 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6577 *error = EINVAL; 6578 return; 6579 } 6580 #ifdef INET 6581 sin6 = (struct sockaddr_in6 *)addr_touse; 6582 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6583 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6584 SCTP_IPV6_V6ONLY(inp)) { 6585 /* can't bind mapped-v4 on PF_INET sockets */ 6586 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6587 *error = EINVAL; 6588 return; 6589 } 6590 in6_sin6_2_sin(&sin, sin6); 6591 addr_touse = (struct sockaddr *)&sin; 6592 } 6593 #endif 6594 } 6595 #endif 6596 #ifdef INET 6597 if (sa->sa_family == AF_INET) { 6598 if (sa->sa_len != sizeof(struct sockaddr_in)) { 6599 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6600 *error = EINVAL; 6601 return; 6602 } 6603 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6604 SCTP_IPV6_V6ONLY(inp)) { 6605 /* can't bind v4 on PF_INET sockets */ 6606 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6607 *error = EINVAL; 6608 return; 6609 } 6610 } 6611 #endif 6612 /* 6613 * No lock required mgmt_ep_sa does its own locking. If the FIX: 6614 * below is ever changed we may need to lock before calling 6615 * association level binding. 6616 */ 6617 if (assoc_id == 0) { 6618 /* delete the address */ 6619 *error = sctp_addr_mgmt_ep_sa(inp, addr_touse, 6620 SCTP_DEL_IP_ADDRESS, 6621 vrf_id, NULL); 6622 } else { 6623 /* 6624 * FIX: decide whether we allow assoc based bindx 6625 */ 6626 } 6627 } 6628 6629 /* 6630 * returns the valid local address count for an assoc, taking into account 6631 * all scoping rules 6632 */ 6633 int 6634 sctp_local_addr_count(struct sctp_tcb *stcb) 6635 { 6636 int loopback_scope; 6637 #if defined(INET) 6638 int ipv4_local_scope, ipv4_addr_legal; 6639 #endif 6640 #if defined (INET6) 6641 int local_scope, site_scope, ipv6_addr_legal; 6642 #endif 6643 struct sctp_vrf *vrf; 6644 struct sctp_ifn *sctp_ifn; 6645 struct sctp_ifa *sctp_ifa; 6646 int count = 0; 6647 6648 /* Turn on all the appropriate scopes */ 6649 loopback_scope = stcb->asoc.scope.loopback_scope; 6650 #if defined(INET) 6651 ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope; 6652 ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; 6653 #endif 6654 #if defined(INET6) 6655 local_scope = stcb->asoc.scope.local_scope; 6656 site_scope = stcb->asoc.scope.site_scope; 6657 ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal; 6658 #endif 6659 SCTP_IPI_ADDR_RLOCK(); 6660 vrf = sctp_find_vrf(stcb->asoc.vrf_id); 6661 if (vrf == NULL) { 6662 /* no vrf, no addresses */ 6663 SCTP_IPI_ADDR_RUNLOCK(); 6664 return (0); 6665 } 6666 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6667 /* 6668 * bound all case: go through all ifns on the vrf 6669 */ 6670 LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 6671 if ((loopback_scope == 0) && 6672 SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { 6673 continue; 6674 } 6675 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 6676 if (sctp_is_addr_restricted(stcb, sctp_ifa)) 6677 continue; 6678 switch (sctp_ifa->address.sa.sa_family) { 6679 #ifdef INET 6680 case AF_INET: 6681 if (ipv4_addr_legal) { 6682 struct sockaddr_in *sin; 6683 6684 sin = &sctp_ifa->address.sin; 6685 if (sin->sin_addr.s_addr == 0) { 6686 /* 6687 * skip unspecified 6688 * addrs 6689 */ 6690 continue; 6691 } 6692 if (prison_check_ip4(stcb->sctp_ep->ip_inp.inp.inp_cred, 6693 &sin->sin_addr) != 0) { 6694 continue; 6695 } 6696 if ((ipv4_local_scope == 0) && 6697 (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) { 6698 continue; 6699 } 6700 /* count this one */ 6701 count++; 6702 } else { 6703 continue; 6704 } 6705 break; 6706 #endif 6707 #ifdef INET6 6708 case AF_INET6: 6709 if (ipv6_addr_legal) { 6710 struct sockaddr_in6 *sin6; 6711 6712 sin6 = &sctp_ifa->address.sin6; 6713 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { 6714 continue; 6715 } 6716 if (prison_check_ip6(stcb->sctp_ep->ip_inp.inp.inp_cred, 6717 &sin6->sin6_addr) != 0) { 6718 continue; 6719 } 6720 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { 6721 if (local_scope == 0) 6722 continue; 6723 if (sin6->sin6_scope_id == 0) { 6724 if (sa6_recoverscope(sin6) != 0) 6725 /* 6726 * 6727 * bad 6728 * link 6729 * 6730 * local 6731 * 6732 * address 6733 */ 6734 continue; 6735 } 6736 } 6737 if ((site_scope == 0) && 6738 (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) { 6739 continue; 6740 } 6741 /* count this one */ 6742 count++; 6743 } 6744 break; 6745 #endif 6746 default: 6747 /* TSNH */ 6748 break; 6749 } 6750 } 6751 } 6752 } else { 6753 /* 6754 * subset bound case 6755 */ 6756 struct sctp_laddr *laddr; 6757 6758 LIST_FOREACH(laddr, &stcb->sctp_ep->sctp_addr_list, 6759 sctp_nxt_addr) { 6760 if (sctp_is_addr_restricted(stcb, laddr->ifa)) { 6761 continue; 6762 } 6763 /* count this one */ 6764 count++; 6765 } 6766 } 6767 SCTP_IPI_ADDR_RUNLOCK(); 6768 return (count); 6769 } 6770 6771 #if defined(SCTP_LOCAL_TRACE_BUF) 6772 6773 void 6774 sctp_log_trace(uint32_t subsys, const char *str SCTP_UNUSED, uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t e, uint32_t f) 6775 { 6776 uint32_t saveindex, newindex; 6777 6778 do { 6779 saveindex = SCTP_BASE_SYSCTL(sctp_log).index; 6780 if (saveindex >= SCTP_MAX_LOGGING_SIZE) { 6781 newindex = 1; 6782 } else { 6783 newindex = saveindex + 1; 6784 } 6785 } while (atomic_cmpset_int(&SCTP_BASE_SYSCTL(sctp_log).index, saveindex, newindex) == 0); 6786 if (saveindex >= SCTP_MAX_LOGGING_SIZE) { 6787 saveindex = 0; 6788 } 6789 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].timestamp = SCTP_GET_CYCLECOUNT; 6790 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].subsys = subsys; 6791 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[0] = a; 6792 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[1] = b; 6793 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[2] = c; 6794 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[3] = d; 6795 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[4] = e; 6796 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[5] = f; 6797 } 6798 6799 #endif 6800 static void 6801 sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *inp, 6802 const struct sockaddr *sa SCTP_UNUSED, void *ctx SCTP_UNUSED) 6803 { 6804 struct ip *iph; 6805 #ifdef INET6 6806 struct ip6_hdr *ip6; 6807 #endif 6808 struct mbuf *sp, *last; 6809 struct udphdr *uhdr; 6810 uint16_t port; 6811 6812 if ((m->m_flags & M_PKTHDR) == 0) { 6813 /* Can't handle one that is not a pkt hdr */ 6814 goto out; 6815 } 6816 /* Pull the src port */ 6817 iph = mtod(m, struct ip *); 6818 uhdr = (struct udphdr *)((caddr_t)iph + off); 6819 port = uhdr->uh_sport; 6820 /* 6821 * Split out the mbuf chain. Leave the IP header in m, place the 6822 * rest in the sp. 6823 */ 6824 sp = m_split(m, off, M_NOWAIT); 6825 if (sp == NULL) { 6826 /* Gak, drop packet, we can't do a split */ 6827 goto out; 6828 } 6829 if (sp->m_pkthdr.len < sizeof(struct udphdr) + sizeof(struct sctphdr)) { 6830 /* Gak, packet can't have an SCTP header in it - too small */ 6831 m_freem(sp); 6832 goto out; 6833 } 6834 /* Now pull up the UDP header and SCTP header together */ 6835 sp = m_pullup(sp, sizeof(struct udphdr) + sizeof(struct sctphdr)); 6836 if (sp == NULL) { 6837 /* Gak pullup failed */ 6838 goto out; 6839 } 6840 /* Trim out the UDP header */ 6841 m_adj(sp, sizeof(struct udphdr)); 6842 6843 /* Now reconstruct the mbuf chain */ 6844 for (last = m; last->m_next; last = last->m_next); 6845 last->m_next = sp; 6846 m->m_pkthdr.len += sp->m_pkthdr.len; 6847 /* 6848 * The CSUM_DATA_VALID flags indicates that the HW checked the UDP 6849 * checksum and it was valid. Since CSUM_DATA_VALID == 6850 * CSUM_SCTP_VALID this would imply that the HW also verified the 6851 * SCTP checksum. Therefore, clear the bit. 6852 */ 6853 SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, 6854 "sctp_recv_udp_tunneled_packet(): Packet of length %d received on %s with csum_flags 0x%b.\n", 6855 m->m_pkthdr.len, 6856 if_name(m->m_pkthdr.rcvif), 6857 (int)m->m_pkthdr.csum_flags, CSUM_BITS); 6858 m->m_pkthdr.csum_flags &= ~CSUM_DATA_VALID; 6859 iph = mtod(m, struct ip *); 6860 switch (iph->ip_v) { 6861 #ifdef INET 6862 case IPVERSION: 6863 iph->ip_len = htons(ntohs(iph->ip_len) - sizeof(struct udphdr)); 6864 sctp_input_with_port(m, off, port); 6865 break; 6866 #endif 6867 #ifdef INET6 6868 case IPV6_VERSION >> 4: 6869 ip6 = mtod(m, struct ip6_hdr *); 6870 ip6->ip6_plen = htons(ntohs(ip6->ip6_plen) - sizeof(struct udphdr)); 6871 sctp6_input_with_port(&m, &off, port); 6872 break; 6873 #endif 6874 default: 6875 goto out; 6876 break; 6877 } 6878 return; 6879 out: 6880 m_freem(m); 6881 } 6882 6883 #ifdef INET 6884 static void 6885 sctp_recv_icmp_tunneled_packet(int cmd, struct sockaddr *sa, void *vip, void *ctx SCTP_UNUSED) 6886 { 6887 struct ip *outer_ip, *inner_ip; 6888 struct sctphdr *sh; 6889 struct icmp *icmp; 6890 struct udphdr *udp; 6891 struct sctp_inpcb *inp; 6892 struct sctp_tcb *stcb; 6893 struct sctp_nets *net; 6894 struct sctp_init_chunk *ch; 6895 struct sockaddr_in src, dst; 6896 uint8_t type, code; 6897 6898 inner_ip = (struct ip *)vip; 6899 icmp = (struct icmp *)((caddr_t)inner_ip - 6900 (sizeof(struct icmp) - sizeof(struct ip))); 6901 outer_ip = (struct ip *)((caddr_t)icmp - sizeof(struct ip)); 6902 if (ntohs(outer_ip->ip_len) < 6903 sizeof(struct ip) + 8 + (inner_ip->ip_hl << 2) + sizeof(struct udphdr) + 8) { 6904 return; 6905 } 6906 udp = (struct udphdr *)((caddr_t)inner_ip + (inner_ip->ip_hl << 2)); 6907 sh = (struct sctphdr *)(udp + 1); 6908 memset(&src, 0, sizeof(struct sockaddr_in)); 6909 src.sin_family = AF_INET; 6910 src.sin_len = sizeof(struct sockaddr_in); 6911 src.sin_port = sh->src_port; 6912 src.sin_addr = inner_ip->ip_src; 6913 memset(&dst, 0, sizeof(struct sockaddr_in)); 6914 dst.sin_family = AF_INET; 6915 dst.sin_len = sizeof(struct sockaddr_in); 6916 dst.sin_port = sh->dest_port; 6917 dst.sin_addr = inner_ip->ip_dst; 6918 /* 6919 * 'dst' holds the dest of the packet that failed to be sent. 'src' 6920 * holds our local endpoint address. Thus we reverse the dst and the 6921 * src in the lookup. 6922 */ 6923 inp = NULL; 6924 net = NULL; 6925 stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst, 6926 (struct sockaddr *)&src, 6927 &inp, &net, 1, 6928 SCTP_DEFAULT_VRFID); 6929 if ((stcb != NULL) && 6930 (net != NULL) && 6931 (inp != NULL)) { 6932 /* Check the UDP port numbers */ 6933 if ((udp->uh_dport != net->port) || 6934 (udp->uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) { 6935 SCTP_TCB_UNLOCK(stcb); 6936 return; 6937 } 6938 /* Check the verification tag */ 6939 if (ntohl(sh->v_tag) != 0) { 6940 /* 6941 * This must be the verification tag used for 6942 * sending out packets. We don't consider packets 6943 * reflecting the verification tag. 6944 */ 6945 if (ntohl(sh->v_tag) != stcb->asoc.peer_vtag) { 6946 SCTP_TCB_UNLOCK(stcb); 6947 return; 6948 } 6949 } else { 6950 if (ntohs(outer_ip->ip_len) >= 6951 sizeof(struct ip) + 6952 8 + (inner_ip->ip_hl << 2) + 8 + 20) { 6953 /* 6954 * In this case we can check if we got an 6955 * INIT chunk and if the initiate tag 6956 * matches. 6957 */ 6958 ch = (struct sctp_init_chunk *)(sh + 1); 6959 if ((ch->ch.chunk_type != SCTP_INITIATION) || 6960 (ntohl(ch->init.initiate_tag) != stcb->asoc.my_vtag)) { 6961 SCTP_TCB_UNLOCK(stcb); 6962 return; 6963 } 6964 } else { 6965 SCTP_TCB_UNLOCK(stcb); 6966 return; 6967 } 6968 } 6969 type = icmp->icmp_type; 6970 code = icmp->icmp_code; 6971 if ((type == ICMP_UNREACH) && 6972 (code == ICMP_UNREACH_PORT)) { 6973 code = ICMP_UNREACH_PROTOCOL; 6974 } 6975 sctp_notify(inp, stcb, net, type, code, 6976 ntohs(inner_ip->ip_len), 6977 (uint32_t)ntohs(icmp->icmp_nextmtu)); 6978 } else { 6979 if ((stcb == NULL) && (inp != NULL)) { 6980 /* reduce ref-count */ 6981 SCTP_INP_WLOCK(inp); 6982 SCTP_INP_DECR_REF(inp); 6983 SCTP_INP_WUNLOCK(inp); 6984 } 6985 if (stcb) { 6986 SCTP_TCB_UNLOCK(stcb); 6987 } 6988 } 6989 return; 6990 } 6991 #endif 6992 6993 #ifdef INET6 6994 static void 6995 sctp_recv_icmp6_tunneled_packet(int cmd, struct sockaddr *sa, void *d, void *ctx SCTP_UNUSED) 6996 { 6997 struct ip6ctlparam *ip6cp; 6998 struct sctp_inpcb *inp; 6999 struct sctp_tcb *stcb; 7000 struct sctp_nets *net; 7001 struct sctphdr sh; 7002 struct udphdr udp; 7003 struct sockaddr_in6 src, dst; 7004 uint8_t type, code; 7005 7006 ip6cp = (struct ip6ctlparam *)d; 7007 /* 7008 * XXX: We assume that when IPV6 is non NULL, M and OFF are valid. 7009 */ 7010 if (ip6cp->ip6c_m == NULL) { 7011 return; 7012 } 7013 /* 7014 * Check if we can safely examine the ports and the verification tag 7015 * of the SCTP common header. 7016 */ 7017 if (ip6cp->ip6c_m->m_pkthdr.len < 7018 ip6cp->ip6c_off + sizeof(struct udphdr) + offsetof(struct sctphdr, checksum)) { 7019 return; 7020 } 7021 /* Copy out the UDP header. */ 7022 memset(&udp, 0, sizeof(struct udphdr)); 7023 m_copydata(ip6cp->ip6c_m, 7024 ip6cp->ip6c_off, 7025 sizeof(struct udphdr), 7026 (caddr_t)&udp); 7027 /* Copy out the port numbers and the verification tag. */ 7028 memset(&sh, 0, sizeof(struct sctphdr)); 7029 m_copydata(ip6cp->ip6c_m, 7030 ip6cp->ip6c_off + sizeof(struct udphdr), 7031 sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t), 7032 (caddr_t)&sh); 7033 memset(&src, 0, sizeof(struct sockaddr_in6)); 7034 src.sin6_family = AF_INET6; 7035 src.sin6_len = sizeof(struct sockaddr_in6); 7036 src.sin6_port = sh.src_port; 7037 src.sin6_addr = ip6cp->ip6c_ip6->ip6_src; 7038 if (in6_setscope(&src.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) { 7039 return; 7040 } 7041 memset(&dst, 0, sizeof(struct sockaddr_in6)); 7042 dst.sin6_family = AF_INET6; 7043 dst.sin6_len = sizeof(struct sockaddr_in6); 7044 dst.sin6_port = sh.dest_port; 7045 dst.sin6_addr = ip6cp->ip6c_ip6->ip6_dst; 7046 if (in6_setscope(&dst.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) { 7047 return; 7048 } 7049 inp = NULL; 7050 net = NULL; 7051 stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst, 7052 (struct sockaddr *)&src, 7053 &inp, &net, 1, SCTP_DEFAULT_VRFID); 7054 if ((stcb != NULL) && 7055 (net != NULL) && 7056 (inp != NULL)) { 7057 /* Check the UDP port numbers */ 7058 if ((udp.uh_dport != net->port) || 7059 (udp.uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) { 7060 SCTP_TCB_UNLOCK(stcb); 7061 return; 7062 } 7063 /* Check the verification tag */ 7064 if (ntohl(sh.v_tag) != 0) { 7065 /* 7066 * This must be the verification tag used for 7067 * sending out packets. We don't consider packets 7068 * reflecting the verification tag. 7069 */ 7070 if (ntohl(sh.v_tag) != stcb->asoc.peer_vtag) { 7071 SCTP_TCB_UNLOCK(stcb); 7072 return; 7073 } 7074 } else { 7075 if (ip6cp->ip6c_m->m_pkthdr.len >= 7076 ip6cp->ip6c_off + sizeof(struct udphdr) + 7077 sizeof(struct sctphdr) + 7078 sizeof(struct sctp_chunkhdr) + 7079 offsetof(struct sctp_init, a_rwnd)) { 7080 /* 7081 * In this case we can check if we got an 7082 * INIT chunk and if the initiate tag 7083 * matches. 7084 */ 7085 uint32_t initiate_tag; 7086 uint8_t chunk_type; 7087 7088 m_copydata(ip6cp->ip6c_m, 7089 ip6cp->ip6c_off + 7090 sizeof(struct udphdr) + 7091 sizeof(struct sctphdr), 7092 sizeof(uint8_t), 7093 (caddr_t)&chunk_type); 7094 m_copydata(ip6cp->ip6c_m, 7095 ip6cp->ip6c_off + 7096 sizeof(struct udphdr) + 7097 sizeof(struct sctphdr) + 7098 sizeof(struct sctp_chunkhdr), 7099 sizeof(uint32_t), 7100 (caddr_t)&initiate_tag); 7101 if ((chunk_type != SCTP_INITIATION) || 7102 (ntohl(initiate_tag) != stcb->asoc.my_vtag)) { 7103 SCTP_TCB_UNLOCK(stcb); 7104 return; 7105 } 7106 } else { 7107 SCTP_TCB_UNLOCK(stcb); 7108 return; 7109 } 7110 } 7111 type = ip6cp->ip6c_icmp6->icmp6_type; 7112 code = ip6cp->ip6c_icmp6->icmp6_code; 7113 if ((type == ICMP6_DST_UNREACH) && 7114 (code == ICMP6_DST_UNREACH_NOPORT)) { 7115 type = ICMP6_PARAM_PROB; 7116 code = ICMP6_PARAMPROB_NEXTHEADER; 7117 } 7118 sctp6_notify(inp, stcb, net, type, code, 7119 ntohl(ip6cp->ip6c_icmp6->icmp6_mtu)); 7120 } else { 7121 if ((stcb == NULL) && (inp != NULL)) { 7122 /* reduce inp's ref-count */ 7123 SCTP_INP_WLOCK(inp); 7124 SCTP_INP_DECR_REF(inp); 7125 SCTP_INP_WUNLOCK(inp); 7126 } 7127 if (stcb) { 7128 SCTP_TCB_UNLOCK(stcb); 7129 } 7130 } 7131 } 7132 #endif 7133 7134 void 7135 sctp_over_udp_stop(void) 7136 { 7137 /* 7138 * This function assumes sysctl caller holds sctp_sysctl_info_lock() 7139 * for writting! 7140 */ 7141 #ifdef INET 7142 if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) { 7143 soclose(SCTP_BASE_INFO(udp4_tun_socket)); 7144 SCTP_BASE_INFO(udp4_tun_socket) = NULL; 7145 } 7146 #endif 7147 #ifdef INET6 7148 if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) { 7149 soclose(SCTP_BASE_INFO(udp6_tun_socket)); 7150 SCTP_BASE_INFO(udp6_tun_socket) = NULL; 7151 } 7152 #endif 7153 } 7154 7155 int 7156 sctp_over_udp_start(void) 7157 { 7158 uint16_t port; 7159 int ret; 7160 #ifdef INET 7161 struct sockaddr_in sin; 7162 #endif 7163 #ifdef INET6 7164 struct sockaddr_in6 sin6; 7165 #endif 7166 /* 7167 * This function assumes sysctl caller holds sctp_sysctl_info_lock() 7168 * for writting! 7169 */ 7170 port = SCTP_BASE_SYSCTL(sctp_udp_tunneling_port); 7171 if (ntohs(port) == 0) { 7172 /* Must have a port set */ 7173 return (EINVAL); 7174 } 7175 #ifdef INET 7176 if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) { 7177 /* Already running -- must stop first */ 7178 return (EALREADY); 7179 } 7180 #endif 7181 #ifdef INET6 7182 if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) { 7183 /* Already running -- must stop first */ 7184 return (EALREADY); 7185 } 7186 #endif 7187 #ifdef INET 7188 if ((ret = socreate(PF_INET, &SCTP_BASE_INFO(udp4_tun_socket), 7189 SOCK_DGRAM, IPPROTO_UDP, 7190 curthread->td_ucred, curthread))) { 7191 sctp_over_udp_stop(); 7192 return (ret); 7193 } 7194 /* Call the special UDP hook. */ 7195 if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp4_tun_socket), 7196 sctp_recv_udp_tunneled_packet, 7197 sctp_recv_icmp_tunneled_packet, 7198 NULL))) { 7199 sctp_over_udp_stop(); 7200 return (ret); 7201 } 7202 /* Ok, we have a socket, bind it to the port. */ 7203 memset(&sin, 0, sizeof(struct sockaddr_in)); 7204 sin.sin_len = sizeof(struct sockaddr_in); 7205 sin.sin_family = AF_INET; 7206 sin.sin_port = htons(port); 7207 if ((ret = sobind(SCTP_BASE_INFO(udp4_tun_socket), 7208 (struct sockaddr *)&sin, curthread))) { 7209 sctp_over_udp_stop(); 7210 return (ret); 7211 } 7212 #endif 7213 #ifdef INET6 7214 if ((ret = socreate(PF_INET6, &SCTP_BASE_INFO(udp6_tun_socket), 7215 SOCK_DGRAM, IPPROTO_UDP, 7216 curthread->td_ucred, curthread))) { 7217 sctp_over_udp_stop(); 7218 return (ret); 7219 } 7220 /* Call the special UDP hook. */ 7221 if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp6_tun_socket), 7222 sctp_recv_udp_tunneled_packet, 7223 sctp_recv_icmp6_tunneled_packet, 7224 NULL))) { 7225 sctp_over_udp_stop(); 7226 return (ret); 7227 } 7228 /* Ok, we have a socket, bind it to the port. */ 7229 memset(&sin6, 0, sizeof(struct sockaddr_in6)); 7230 sin6.sin6_len = sizeof(struct sockaddr_in6); 7231 sin6.sin6_family = AF_INET6; 7232 sin6.sin6_port = htons(port); 7233 if ((ret = sobind(SCTP_BASE_INFO(udp6_tun_socket), 7234 (struct sockaddr *)&sin6, curthread))) { 7235 sctp_over_udp_stop(); 7236 return (ret); 7237 } 7238 #endif 7239 return (0); 7240 } 7241 7242 #if defined(INET6) || defined(INET) 7243 7244 /* 7245 * sctp_min_mtu ()returns the minimum of all non-zero arguments. 7246 * If all arguments are zero, zero is returned. 7247 */ 7248 uint32_t 7249 sctp_min_mtu(uint32_t mtu1, uint32_t mtu2, uint32_t mtu3) 7250 { 7251 if (mtu1 > 0) { 7252 if (mtu2 > 0) { 7253 if (mtu3 > 0) { 7254 return (min(mtu1, min(mtu2, mtu3))); 7255 } else { 7256 return (min(mtu1, mtu2)); 7257 } 7258 } else { 7259 if (mtu3 > 0) { 7260 return (min(mtu1, mtu3)); 7261 } else { 7262 return (mtu1); 7263 } 7264 } 7265 } else { 7266 if (mtu2 > 0) { 7267 if (mtu3 > 0) { 7268 return (min(mtu2, mtu3)); 7269 } else { 7270 return (mtu2); 7271 } 7272 } else { 7273 return (mtu3); 7274 } 7275 } 7276 } 7277 7278 void 7279 sctp_hc_set_mtu(union sctp_sockstore *addr, uint16_t fibnum, uint32_t mtu) 7280 { 7281 struct in_conninfo inc; 7282 7283 memset(&inc, 0, sizeof(struct in_conninfo)); 7284 inc.inc_fibnum = fibnum; 7285 switch (addr->sa.sa_family) { 7286 #ifdef INET 7287 case AF_INET: 7288 inc.inc_faddr = addr->sin.sin_addr; 7289 break; 7290 #endif 7291 #ifdef INET6 7292 case AF_INET6: 7293 inc.inc_flags |= INC_ISIPV6; 7294 inc.inc6_faddr = addr->sin6.sin6_addr; 7295 break; 7296 #endif 7297 default: 7298 return; 7299 } 7300 tcp_hc_updatemtu(&inc, (u_long)mtu); 7301 } 7302 7303 uint32_t 7304 sctp_hc_get_mtu(union sctp_sockstore *addr, uint16_t fibnum) 7305 { 7306 struct in_conninfo inc; 7307 7308 memset(&inc, 0, sizeof(struct in_conninfo)); 7309 inc.inc_fibnum = fibnum; 7310 switch (addr->sa.sa_family) { 7311 #ifdef INET 7312 case AF_INET: 7313 inc.inc_faddr = addr->sin.sin_addr; 7314 break; 7315 #endif 7316 #ifdef INET6 7317 case AF_INET6: 7318 inc.inc_flags |= INC_ISIPV6; 7319 inc.inc6_faddr = addr->sin6.sin6_addr; 7320 break; 7321 #endif 7322 default: 7323 return (0); 7324 } 7325 return ((uint32_t)tcp_hc_getmtu(&inc)); 7326 } 7327 #endif 7328