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 SOCK_UNLOCK(stcb->sctp_socket); 2796 } 2797 /* Wake ANY sleepers */ 2798 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 2799 so = SCTP_INP_SO(stcb->sctp_ep); 2800 if (!so_locked) { 2801 atomic_add_int(&stcb->asoc.refcnt, 1); 2802 SCTP_TCB_UNLOCK(stcb); 2803 SCTP_SOCKET_LOCK(so, 1); 2804 SCTP_TCB_LOCK(stcb); 2805 atomic_subtract_int(&stcb->asoc.refcnt, 1); 2806 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 2807 SCTP_SOCKET_UNLOCK(so, 1); 2808 return; 2809 } 2810 } 2811 #endif 2812 if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 2813 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && 2814 ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) { 2815 socantrcvmore(stcb->sctp_socket); 2816 } 2817 sorwakeup(stcb->sctp_socket); 2818 sowwakeup(stcb->sctp_socket); 2819 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 2820 if (!so_locked) { 2821 SCTP_SOCKET_UNLOCK(so, 1); 2822 } 2823 #endif 2824 } 2825 2826 static void 2827 sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state, 2828 struct sockaddr *sa, uint32_t error, int so_locked 2829 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2830 SCTP_UNUSED 2831 #endif 2832 ) 2833 { 2834 struct mbuf *m_notify; 2835 struct sctp_paddr_change *spc; 2836 struct sctp_queued_to_read *control; 2837 2838 if ((stcb == NULL) || 2839 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPADDREVNT)) { 2840 /* event not enabled */ 2841 return; 2842 } 2843 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_paddr_change), 0, M_NOWAIT, 1, MT_DATA); 2844 if (m_notify == NULL) 2845 return; 2846 SCTP_BUF_LEN(m_notify) = 0; 2847 spc = mtod(m_notify, struct sctp_paddr_change *); 2848 memset(spc, 0, sizeof(struct sctp_paddr_change)); 2849 spc->spc_type = SCTP_PEER_ADDR_CHANGE; 2850 spc->spc_flags = 0; 2851 spc->spc_length = sizeof(struct sctp_paddr_change); 2852 switch (sa->sa_family) { 2853 #ifdef INET 2854 case AF_INET: 2855 #ifdef INET6 2856 if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) { 2857 in6_sin_2_v4mapsin6((struct sockaddr_in *)sa, 2858 (struct sockaddr_in6 *)&spc->spc_aaddr); 2859 } else { 2860 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in)); 2861 } 2862 #else 2863 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in)); 2864 #endif 2865 break; 2866 #endif 2867 #ifdef INET6 2868 case AF_INET6: 2869 { 2870 struct sockaddr_in6 *sin6; 2871 2872 memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in6)); 2873 2874 sin6 = (struct sockaddr_in6 *)&spc->spc_aaddr; 2875 if (IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) { 2876 if (sin6->sin6_scope_id == 0) { 2877 /* recover scope_id for user */ 2878 (void)sa6_recoverscope(sin6); 2879 } else { 2880 /* clear embedded scope_id for user */ 2881 in6_clearscope(&sin6->sin6_addr); 2882 } 2883 } 2884 break; 2885 } 2886 #endif 2887 default: 2888 /* TSNH */ 2889 break; 2890 } 2891 spc->spc_state = state; 2892 spc->spc_error = error; 2893 spc->spc_assoc_id = sctp_get_associd(stcb); 2894 2895 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_paddr_change); 2896 SCTP_BUF_NEXT(m_notify) = NULL; 2897 2898 /* append to socket */ 2899 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 2900 0, 0, stcb->asoc.context, 0, 0, 0, 2901 m_notify); 2902 if (control == NULL) { 2903 /* no memory */ 2904 sctp_m_freem(m_notify); 2905 return; 2906 } 2907 control->length = SCTP_BUF_LEN(m_notify); 2908 control->spec_flags = M_NOTIFICATION; 2909 /* not that we need this */ 2910 control->tail_mbuf = m_notify; 2911 sctp_add_to_readq(stcb->sctp_ep, stcb, 2912 control, 2913 &stcb->sctp_socket->so_rcv, 1, 2914 SCTP_READ_LOCK_NOT_HELD, 2915 so_locked); 2916 } 2917 2918 2919 static void 2920 sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error, 2921 struct sctp_tmit_chunk *chk, int so_locked 2922 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2923 SCTP_UNUSED 2924 #endif 2925 ) 2926 { 2927 struct mbuf *m_notify; 2928 struct sctp_send_failed *ssf; 2929 struct sctp_send_failed_event *ssfe; 2930 struct sctp_queued_to_read *control; 2931 struct sctp_chunkhdr *chkhdr; 2932 int notifhdr_len, chk_len, chkhdr_len, padding_len, payload_len; 2933 2934 if ((stcb == NULL) || 2935 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && 2936 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { 2937 /* event not enabled */ 2938 return; 2939 } 2940 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 2941 notifhdr_len = sizeof(struct sctp_send_failed_event); 2942 } else { 2943 notifhdr_len = sizeof(struct sctp_send_failed); 2944 } 2945 m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA); 2946 if (m_notify == NULL) 2947 /* no space left */ 2948 return; 2949 SCTP_BUF_LEN(m_notify) = notifhdr_len; 2950 if (stcb->asoc.idata_supported) { 2951 chkhdr_len = sizeof(struct sctp_idata_chunk); 2952 } else { 2953 chkhdr_len = sizeof(struct sctp_data_chunk); 2954 } 2955 /* Use some defaults in case we can't access the chunk header */ 2956 if (chk->send_size >= chkhdr_len) { 2957 payload_len = chk->send_size - chkhdr_len; 2958 } else { 2959 payload_len = 0; 2960 } 2961 padding_len = 0; 2962 if (chk->data != NULL) { 2963 chkhdr = mtod(chk->data, struct sctp_chunkhdr *); 2964 if (chkhdr != NULL) { 2965 chk_len = ntohs(chkhdr->chunk_length); 2966 if ((chk_len >= chkhdr_len) && 2967 (chk->send_size >= chk_len) && 2968 (chk->send_size - chk_len < 4)) { 2969 padding_len = chk->send_size - chk_len; 2970 payload_len = chk->send_size - chkhdr_len - padding_len; 2971 } 2972 } 2973 } 2974 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 2975 ssfe = mtod(m_notify, struct sctp_send_failed_event *); 2976 memset(ssfe, 0, notifhdr_len); 2977 ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT; 2978 if (sent) { 2979 ssfe->ssfe_flags = SCTP_DATA_SENT; 2980 } else { 2981 ssfe->ssfe_flags = SCTP_DATA_UNSENT; 2982 } 2983 ssfe->ssfe_length = (uint32_t)(notifhdr_len + payload_len); 2984 ssfe->ssfe_error = error; 2985 /* not exactly what the user sent in, but should be close :) */ 2986 ssfe->ssfe_info.snd_sid = chk->rec.data.sid; 2987 ssfe->ssfe_info.snd_flags = chk->rec.data.rcv_flags; 2988 ssfe->ssfe_info.snd_ppid = chk->rec.data.ppid; 2989 ssfe->ssfe_info.snd_context = chk->rec.data.context; 2990 ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); 2991 ssfe->ssfe_assoc_id = sctp_get_associd(stcb); 2992 } else { 2993 ssf = mtod(m_notify, struct sctp_send_failed *); 2994 memset(ssf, 0, notifhdr_len); 2995 ssf->ssf_type = SCTP_SEND_FAILED; 2996 if (sent) { 2997 ssf->ssf_flags = SCTP_DATA_SENT; 2998 } else { 2999 ssf->ssf_flags = SCTP_DATA_UNSENT; 3000 } 3001 ssf->ssf_length = (uint32_t)(notifhdr_len + payload_len); 3002 ssf->ssf_error = error; 3003 /* not exactly what the user sent in, but should be close :) */ 3004 ssf->ssf_info.sinfo_stream = chk->rec.data.sid; 3005 ssf->ssf_info.sinfo_ssn = (uint16_t)chk->rec.data.mid; 3006 ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags; 3007 ssf->ssf_info.sinfo_ppid = chk->rec.data.ppid; 3008 ssf->ssf_info.sinfo_context = chk->rec.data.context; 3009 ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); 3010 ssf->ssf_assoc_id = sctp_get_associd(stcb); 3011 } 3012 if (chk->data != NULL) { 3013 /* Trim off the sctp chunk header (it should be there) */ 3014 if (chk->send_size == chkhdr_len + payload_len + padding_len) { 3015 m_adj(chk->data, chkhdr_len); 3016 m_adj(chk->data, -padding_len); 3017 sctp_mbuf_crush(chk->data); 3018 chk->send_size -= (chkhdr_len + padding_len); 3019 } 3020 } 3021 SCTP_BUF_NEXT(m_notify) = chk->data; 3022 /* Steal off the mbuf */ 3023 chk->data = NULL; 3024 /* 3025 * For this case, we check the actual socket buffer, since the assoc 3026 * is going away we don't want to overfill the socket buffer for a 3027 * non-reader 3028 */ 3029 if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3030 sctp_m_freem(m_notify); 3031 return; 3032 } 3033 /* append to socket */ 3034 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3035 0, 0, stcb->asoc.context, 0, 0, 0, 3036 m_notify); 3037 if (control == NULL) { 3038 /* no memory */ 3039 sctp_m_freem(m_notify); 3040 return; 3041 } 3042 control->spec_flags = M_NOTIFICATION; 3043 sctp_add_to_readq(stcb->sctp_ep, stcb, 3044 control, 3045 &stcb->sctp_socket->so_rcv, 1, 3046 SCTP_READ_LOCK_NOT_HELD, 3047 so_locked); 3048 } 3049 3050 3051 static void 3052 sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, 3053 struct sctp_stream_queue_pending *sp, int so_locked 3054 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3055 SCTP_UNUSED 3056 #endif 3057 ) 3058 { 3059 struct mbuf *m_notify; 3060 struct sctp_send_failed *ssf; 3061 struct sctp_send_failed_event *ssfe; 3062 struct sctp_queued_to_read *control; 3063 int notifhdr_len; 3064 3065 if ((stcb == NULL) || 3066 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) && 3067 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) { 3068 /* event not enabled */ 3069 return; 3070 } 3071 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 3072 notifhdr_len = sizeof(struct sctp_send_failed_event); 3073 } else { 3074 notifhdr_len = sizeof(struct sctp_send_failed); 3075 } 3076 m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA); 3077 if (m_notify == NULL) { 3078 /* no space left */ 3079 return; 3080 } 3081 SCTP_BUF_LEN(m_notify) = notifhdr_len; 3082 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) { 3083 ssfe = mtod(m_notify, struct sctp_send_failed_event *); 3084 memset(ssfe, 0, notifhdr_len); 3085 ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT; 3086 ssfe->ssfe_flags = SCTP_DATA_UNSENT; 3087 ssfe->ssfe_length = (uint32_t)(notifhdr_len + sp->length); 3088 ssfe->ssfe_error = error; 3089 /* not exactly what the user sent in, but should be close :) */ 3090 ssfe->ssfe_info.snd_sid = sp->sid; 3091 if (sp->some_taken) { 3092 ssfe->ssfe_info.snd_flags = SCTP_DATA_LAST_FRAG; 3093 } else { 3094 ssfe->ssfe_info.snd_flags = SCTP_DATA_NOT_FRAG; 3095 } 3096 ssfe->ssfe_info.snd_ppid = sp->ppid; 3097 ssfe->ssfe_info.snd_context = sp->context; 3098 ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb); 3099 ssfe->ssfe_assoc_id = sctp_get_associd(stcb); 3100 } else { 3101 ssf = mtod(m_notify, struct sctp_send_failed *); 3102 memset(ssf, 0, notifhdr_len); 3103 ssf->ssf_type = SCTP_SEND_FAILED; 3104 ssf->ssf_flags = SCTP_DATA_UNSENT; 3105 ssf->ssf_length = (uint32_t)(notifhdr_len + sp->length); 3106 ssf->ssf_error = error; 3107 /* not exactly what the user sent in, but should be close :) */ 3108 ssf->ssf_info.sinfo_stream = sp->sid; 3109 ssf->ssf_info.sinfo_ssn = 0; 3110 if (sp->some_taken) { 3111 ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; 3112 } else { 3113 ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; 3114 } 3115 ssf->ssf_info.sinfo_ppid = sp->ppid; 3116 ssf->ssf_info.sinfo_context = sp->context; 3117 ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); 3118 ssf->ssf_assoc_id = sctp_get_associd(stcb); 3119 } 3120 SCTP_BUF_NEXT(m_notify) = sp->data; 3121 3122 /* Steal off the mbuf */ 3123 sp->data = NULL; 3124 /* 3125 * For this case, we check the actual socket buffer, since the assoc 3126 * is going away we don't want to overfill the socket buffer for a 3127 * non-reader 3128 */ 3129 if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3130 sctp_m_freem(m_notify); 3131 return; 3132 } 3133 /* append to socket */ 3134 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3135 0, 0, stcb->asoc.context, 0, 0, 0, 3136 m_notify); 3137 if (control == NULL) { 3138 /* no memory */ 3139 sctp_m_freem(m_notify); 3140 return; 3141 } 3142 control->spec_flags = M_NOTIFICATION; 3143 sctp_add_to_readq(stcb->sctp_ep, stcb, 3144 control, 3145 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); 3146 } 3147 3148 3149 3150 static void 3151 sctp_notify_adaptation_layer(struct sctp_tcb *stcb) 3152 { 3153 struct mbuf *m_notify; 3154 struct sctp_adaptation_event *sai; 3155 struct sctp_queued_to_read *control; 3156 3157 if ((stcb == NULL) || 3158 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ADAPTATIONEVNT)) { 3159 /* event not enabled */ 3160 return; 3161 } 3162 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_adaption_event), 0, M_NOWAIT, 1, MT_DATA); 3163 if (m_notify == NULL) 3164 /* no space left */ 3165 return; 3166 SCTP_BUF_LEN(m_notify) = 0; 3167 sai = mtod(m_notify, struct sctp_adaptation_event *); 3168 memset(sai, 0, sizeof(struct sctp_adaptation_event)); 3169 sai->sai_type = SCTP_ADAPTATION_INDICATION; 3170 sai->sai_flags = 0; 3171 sai->sai_length = sizeof(struct sctp_adaptation_event); 3172 sai->sai_adaptation_ind = stcb->asoc.peers_adaptation; 3173 sai->sai_assoc_id = sctp_get_associd(stcb); 3174 3175 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_adaptation_event); 3176 SCTP_BUF_NEXT(m_notify) = NULL; 3177 3178 /* append to socket */ 3179 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3180 0, 0, stcb->asoc.context, 0, 0, 0, 3181 m_notify); 3182 if (control == NULL) { 3183 /* no memory */ 3184 sctp_m_freem(m_notify); 3185 return; 3186 } 3187 control->length = SCTP_BUF_LEN(m_notify); 3188 control->spec_flags = M_NOTIFICATION; 3189 /* not that we need this */ 3190 control->tail_mbuf = m_notify; 3191 sctp_add_to_readq(stcb->sctp_ep, stcb, 3192 control, 3193 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3194 } 3195 3196 /* This always must be called with the read-queue LOCKED in the INP */ 3197 static void 3198 sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error, 3199 uint32_t val, int so_locked 3200 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3201 SCTP_UNUSED 3202 #endif 3203 ) 3204 { 3205 struct mbuf *m_notify; 3206 struct sctp_pdapi_event *pdapi; 3207 struct sctp_queued_to_read *control; 3208 struct sockbuf *sb; 3209 3210 if ((stcb == NULL) || 3211 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_PDAPIEVNT)) { 3212 /* event not enabled */ 3213 return; 3214 } 3215 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) { 3216 return; 3217 } 3218 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_pdapi_event), 0, M_NOWAIT, 1, MT_DATA); 3219 if (m_notify == NULL) 3220 /* no space left */ 3221 return; 3222 SCTP_BUF_LEN(m_notify) = 0; 3223 pdapi = mtod(m_notify, struct sctp_pdapi_event *); 3224 memset(pdapi, 0, sizeof(struct sctp_pdapi_event)); 3225 pdapi->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT; 3226 pdapi->pdapi_flags = 0; 3227 pdapi->pdapi_length = sizeof(struct sctp_pdapi_event); 3228 pdapi->pdapi_indication = error; 3229 pdapi->pdapi_stream = (val >> 16); 3230 pdapi->pdapi_seq = (val & 0x0000ffff); 3231 pdapi->pdapi_assoc_id = sctp_get_associd(stcb); 3232 3233 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_pdapi_event); 3234 SCTP_BUF_NEXT(m_notify) = NULL; 3235 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3236 0, 0, stcb->asoc.context, 0, 0, 0, 3237 m_notify); 3238 if (control == NULL) { 3239 /* no memory */ 3240 sctp_m_freem(m_notify); 3241 return; 3242 } 3243 control->spec_flags = M_NOTIFICATION; 3244 control->length = SCTP_BUF_LEN(m_notify); 3245 /* not that we need this */ 3246 control->tail_mbuf = m_notify; 3247 control->held_length = 0; 3248 control->length = 0; 3249 sb = &stcb->sctp_socket->so_rcv; 3250 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 3251 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m_notify)); 3252 } 3253 sctp_sballoc(stcb, sb, m_notify); 3254 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 3255 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 3256 } 3257 atomic_add_int(&control->length, SCTP_BUF_LEN(m_notify)); 3258 control->end_added = 1; 3259 if (stcb->asoc.control_pdapi) 3260 TAILQ_INSERT_AFTER(&stcb->sctp_ep->read_queue, stcb->asoc.control_pdapi, control, next); 3261 else { 3262 /* we really should not see this case */ 3263 TAILQ_INSERT_TAIL(&stcb->sctp_ep->read_queue, control, next); 3264 } 3265 if (stcb->sctp_ep && stcb->sctp_socket) { 3266 /* This should always be the case */ 3267 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3268 struct socket *so; 3269 3270 so = SCTP_INP_SO(stcb->sctp_ep); 3271 if (!so_locked) { 3272 atomic_add_int(&stcb->asoc.refcnt, 1); 3273 SCTP_TCB_UNLOCK(stcb); 3274 SCTP_SOCKET_LOCK(so, 1); 3275 SCTP_TCB_LOCK(stcb); 3276 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3277 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 3278 SCTP_SOCKET_UNLOCK(so, 1); 3279 return; 3280 } 3281 } 3282 #endif 3283 sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket); 3284 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3285 if (!so_locked) { 3286 SCTP_SOCKET_UNLOCK(so, 1); 3287 } 3288 #endif 3289 } 3290 } 3291 3292 static void 3293 sctp_notify_shutdown_event(struct sctp_tcb *stcb) 3294 { 3295 struct mbuf *m_notify; 3296 struct sctp_shutdown_event *sse; 3297 struct sctp_queued_to_read *control; 3298 3299 /* 3300 * For TCP model AND UDP connected sockets we will send an error up 3301 * when an SHUTDOWN completes 3302 */ 3303 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 3304 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { 3305 /* mark socket closed for read/write and wakeup! */ 3306 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3307 struct socket *so; 3308 3309 so = SCTP_INP_SO(stcb->sctp_ep); 3310 atomic_add_int(&stcb->asoc.refcnt, 1); 3311 SCTP_TCB_UNLOCK(stcb); 3312 SCTP_SOCKET_LOCK(so, 1); 3313 SCTP_TCB_LOCK(stcb); 3314 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3315 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 3316 SCTP_SOCKET_UNLOCK(so, 1); 3317 return; 3318 } 3319 #endif 3320 socantsendmore(stcb->sctp_socket); 3321 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3322 SCTP_SOCKET_UNLOCK(so, 1); 3323 #endif 3324 } 3325 if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT)) { 3326 /* event not enabled */ 3327 return; 3328 } 3329 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_event), 0, M_NOWAIT, 1, MT_DATA); 3330 if (m_notify == NULL) 3331 /* no space left */ 3332 return; 3333 sse = mtod(m_notify, struct sctp_shutdown_event *); 3334 memset(sse, 0, sizeof(struct sctp_shutdown_event)); 3335 sse->sse_type = SCTP_SHUTDOWN_EVENT; 3336 sse->sse_flags = 0; 3337 sse->sse_length = sizeof(struct sctp_shutdown_event); 3338 sse->sse_assoc_id = sctp_get_associd(stcb); 3339 3340 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_shutdown_event); 3341 SCTP_BUF_NEXT(m_notify) = NULL; 3342 3343 /* append to socket */ 3344 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3345 0, 0, stcb->asoc.context, 0, 0, 0, 3346 m_notify); 3347 if (control == NULL) { 3348 /* no memory */ 3349 sctp_m_freem(m_notify); 3350 return; 3351 } 3352 control->spec_flags = M_NOTIFICATION; 3353 control->length = SCTP_BUF_LEN(m_notify); 3354 /* not that we need this */ 3355 control->tail_mbuf = m_notify; 3356 sctp_add_to_readq(stcb->sctp_ep, stcb, 3357 control, 3358 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3359 } 3360 3361 static void 3362 sctp_notify_sender_dry_event(struct sctp_tcb *stcb, 3363 int so_locked 3364 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3365 SCTP_UNUSED 3366 #endif 3367 ) 3368 { 3369 struct mbuf *m_notify; 3370 struct sctp_sender_dry_event *event; 3371 struct sctp_queued_to_read *control; 3372 3373 if ((stcb == NULL) || 3374 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_DRYEVNT)) { 3375 /* event not enabled */ 3376 return; 3377 } 3378 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_sender_dry_event), 0, M_NOWAIT, 1, MT_DATA); 3379 if (m_notify == NULL) { 3380 /* no space left */ 3381 return; 3382 } 3383 SCTP_BUF_LEN(m_notify) = 0; 3384 event = mtod(m_notify, struct sctp_sender_dry_event *); 3385 memset(event, 0, sizeof(struct sctp_sender_dry_event)); 3386 event->sender_dry_type = SCTP_SENDER_DRY_EVENT; 3387 event->sender_dry_flags = 0; 3388 event->sender_dry_length = sizeof(struct sctp_sender_dry_event); 3389 event->sender_dry_assoc_id = sctp_get_associd(stcb); 3390 3391 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_sender_dry_event); 3392 SCTP_BUF_NEXT(m_notify) = NULL; 3393 3394 /* append to socket */ 3395 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3396 0, 0, stcb->asoc.context, 0, 0, 0, 3397 m_notify); 3398 if (control == NULL) { 3399 /* no memory */ 3400 sctp_m_freem(m_notify); 3401 return; 3402 } 3403 control->length = SCTP_BUF_LEN(m_notify); 3404 control->spec_flags = M_NOTIFICATION; 3405 /* not that we need this */ 3406 control->tail_mbuf = m_notify; 3407 sctp_add_to_readq(stcb->sctp_ep, stcb, control, 3408 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); 3409 } 3410 3411 3412 void 3413 sctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, uint16_t numberout, int flag) 3414 { 3415 struct mbuf *m_notify; 3416 struct sctp_queued_to_read *control; 3417 struct sctp_stream_change_event *stradd; 3418 3419 if ((stcb == NULL) || 3420 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_CHANGEEVNT))) { 3421 /* event not enabled */ 3422 return; 3423 } 3424 if ((stcb->asoc.peer_req_out) && flag) { 3425 /* Peer made the request, don't tell the local user */ 3426 stcb->asoc.peer_req_out = 0; 3427 return; 3428 } 3429 stcb->asoc.peer_req_out = 0; 3430 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_stream_change_event), 0, M_NOWAIT, 1, MT_DATA); 3431 if (m_notify == NULL) 3432 /* no space left */ 3433 return; 3434 SCTP_BUF_LEN(m_notify) = 0; 3435 stradd = mtod(m_notify, struct sctp_stream_change_event *); 3436 memset(stradd, 0, sizeof(struct sctp_stream_change_event)); 3437 stradd->strchange_type = SCTP_STREAM_CHANGE_EVENT; 3438 stradd->strchange_flags = flag; 3439 stradd->strchange_length = sizeof(struct sctp_stream_change_event); 3440 stradd->strchange_assoc_id = sctp_get_associd(stcb); 3441 stradd->strchange_instrms = numberin; 3442 stradd->strchange_outstrms = numberout; 3443 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_stream_change_event); 3444 SCTP_BUF_NEXT(m_notify) = NULL; 3445 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3446 /* no space */ 3447 sctp_m_freem(m_notify); 3448 return; 3449 } 3450 /* append to socket */ 3451 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3452 0, 0, stcb->asoc.context, 0, 0, 0, 3453 m_notify); 3454 if (control == NULL) { 3455 /* no memory */ 3456 sctp_m_freem(m_notify); 3457 return; 3458 } 3459 control->spec_flags = M_NOTIFICATION; 3460 control->length = SCTP_BUF_LEN(m_notify); 3461 /* not that we need this */ 3462 control->tail_mbuf = m_notify; 3463 sctp_add_to_readq(stcb->sctp_ep, stcb, 3464 control, 3465 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3466 } 3467 3468 void 3469 sctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32_t recv_tsn, int flag) 3470 { 3471 struct mbuf *m_notify; 3472 struct sctp_queued_to_read *control; 3473 struct sctp_assoc_reset_event *strasoc; 3474 3475 if ((stcb == NULL) || 3476 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ASSOC_RESETEVNT))) { 3477 /* event not enabled */ 3478 return; 3479 } 3480 m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_assoc_reset_event), 0, M_NOWAIT, 1, MT_DATA); 3481 if (m_notify == NULL) 3482 /* no space left */ 3483 return; 3484 SCTP_BUF_LEN(m_notify) = 0; 3485 strasoc = mtod(m_notify, struct sctp_assoc_reset_event *); 3486 memset(strasoc, 0, sizeof(struct sctp_assoc_reset_event)); 3487 strasoc->assocreset_type = SCTP_ASSOC_RESET_EVENT; 3488 strasoc->assocreset_flags = flag; 3489 strasoc->assocreset_length = sizeof(struct sctp_assoc_reset_event); 3490 strasoc->assocreset_assoc_id = sctp_get_associd(stcb); 3491 strasoc->assocreset_local_tsn = sending_tsn; 3492 strasoc->assocreset_remote_tsn = recv_tsn; 3493 SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_assoc_reset_event); 3494 SCTP_BUF_NEXT(m_notify) = NULL; 3495 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3496 /* no space */ 3497 sctp_m_freem(m_notify); 3498 return; 3499 } 3500 /* append to socket */ 3501 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3502 0, 0, stcb->asoc.context, 0, 0, 0, 3503 m_notify); 3504 if (control == NULL) { 3505 /* no memory */ 3506 sctp_m_freem(m_notify); 3507 return; 3508 } 3509 control->spec_flags = M_NOTIFICATION; 3510 control->length = SCTP_BUF_LEN(m_notify); 3511 /* not that we need this */ 3512 control->tail_mbuf = m_notify; 3513 sctp_add_to_readq(stcb->sctp_ep, stcb, 3514 control, 3515 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3516 } 3517 3518 3519 3520 static void 3521 sctp_notify_stream_reset(struct sctp_tcb *stcb, 3522 int number_entries, uint16_t *list, int flag) 3523 { 3524 struct mbuf *m_notify; 3525 struct sctp_queued_to_read *control; 3526 struct sctp_stream_reset_event *strreset; 3527 int len; 3528 3529 if ((stcb == NULL) || 3530 (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT))) { 3531 /* event not enabled */ 3532 return; 3533 } 3534 m_notify = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); 3535 if (m_notify == NULL) 3536 /* no space left */ 3537 return; 3538 SCTP_BUF_LEN(m_notify) = 0; 3539 len = sizeof(struct sctp_stream_reset_event) + (number_entries * sizeof(uint16_t)); 3540 if (len > M_TRAILINGSPACE(m_notify)) { 3541 /* never enough room */ 3542 sctp_m_freem(m_notify); 3543 return; 3544 } 3545 strreset = mtod(m_notify, struct sctp_stream_reset_event *); 3546 memset(strreset, 0, len); 3547 strreset->strreset_type = SCTP_STREAM_RESET_EVENT; 3548 strreset->strreset_flags = flag; 3549 strreset->strreset_length = len; 3550 strreset->strreset_assoc_id = sctp_get_associd(stcb); 3551 if (number_entries) { 3552 int i; 3553 3554 for (i = 0; i < number_entries; i++) { 3555 strreset->strreset_stream_list[i] = ntohs(list[i]); 3556 } 3557 } 3558 SCTP_BUF_LEN(m_notify) = len; 3559 SCTP_BUF_NEXT(m_notify) = NULL; 3560 if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) { 3561 /* no space */ 3562 sctp_m_freem(m_notify); 3563 return; 3564 } 3565 /* append to socket */ 3566 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3567 0, 0, stcb->asoc.context, 0, 0, 0, 3568 m_notify); 3569 if (control == NULL) { 3570 /* no memory */ 3571 sctp_m_freem(m_notify); 3572 return; 3573 } 3574 control->spec_flags = M_NOTIFICATION; 3575 control->length = SCTP_BUF_LEN(m_notify); 3576 /* not that we need this */ 3577 control->tail_mbuf = m_notify; 3578 sctp_add_to_readq(stcb->sctp_ep, stcb, 3579 control, 3580 &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3581 } 3582 3583 3584 static void 3585 sctp_notify_remote_error(struct sctp_tcb *stcb, uint16_t error, struct sctp_error_chunk *chunk) 3586 { 3587 struct mbuf *m_notify; 3588 struct sctp_remote_error *sre; 3589 struct sctp_queued_to_read *control; 3590 unsigned int notif_len; 3591 uint16_t chunk_len; 3592 3593 if ((stcb == NULL) || 3594 sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPEERERR)) { 3595 return; 3596 } 3597 if (chunk != NULL) { 3598 chunk_len = ntohs(chunk->ch.chunk_length); 3599 } else { 3600 chunk_len = 0; 3601 } 3602 notif_len = (unsigned int)(sizeof(struct sctp_remote_error) + chunk_len); 3603 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 3604 if (m_notify == NULL) { 3605 /* Retry with smaller value. */ 3606 notif_len = (unsigned int)sizeof(struct sctp_remote_error); 3607 m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA); 3608 if (m_notify == NULL) { 3609 return; 3610 } 3611 } 3612 SCTP_BUF_NEXT(m_notify) = NULL; 3613 sre = mtod(m_notify, struct sctp_remote_error *); 3614 memset(sre, 0, notif_len); 3615 sre->sre_type = SCTP_REMOTE_ERROR; 3616 sre->sre_flags = 0; 3617 sre->sre_length = sizeof(struct sctp_remote_error); 3618 sre->sre_error = error; 3619 sre->sre_assoc_id = sctp_get_associd(stcb); 3620 if (notif_len > sizeof(struct sctp_remote_error)) { 3621 memcpy(sre->sre_data, chunk, chunk_len); 3622 sre->sre_length += chunk_len; 3623 } 3624 SCTP_BUF_LEN(m_notify) = sre->sre_length; 3625 control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination, 3626 0, 0, stcb->asoc.context, 0, 0, 0, 3627 m_notify); 3628 if (control != NULL) { 3629 control->length = SCTP_BUF_LEN(m_notify); 3630 /* not that we need this */ 3631 control->tail_mbuf = m_notify; 3632 control->spec_flags = M_NOTIFICATION; 3633 sctp_add_to_readq(stcb->sctp_ep, stcb, 3634 control, 3635 &stcb->sctp_socket->so_rcv, 1, 3636 SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); 3637 } else { 3638 sctp_m_freem(m_notify); 3639 } 3640 } 3641 3642 3643 void 3644 sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, 3645 uint32_t error, void *data, int so_locked 3646 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3647 SCTP_UNUSED 3648 #endif 3649 ) 3650 { 3651 if ((stcb == NULL) || 3652 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3653 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3654 (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { 3655 /* If the socket is gone we are out of here */ 3656 return; 3657 } 3658 if (stcb->sctp_socket->so_rcv.sb_state & SBS_CANTRCVMORE) { 3659 return; 3660 } 3661 if ((stcb->asoc.state & SCTP_STATE_COOKIE_WAIT) || 3662 (stcb->asoc.state & SCTP_STATE_COOKIE_ECHOED)) { 3663 if ((notification == SCTP_NOTIFY_INTERFACE_DOWN) || 3664 (notification == SCTP_NOTIFY_INTERFACE_UP) || 3665 (notification == SCTP_NOTIFY_INTERFACE_CONFIRMED)) { 3666 /* Don't report these in front states */ 3667 return; 3668 } 3669 } 3670 switch (notification) { 3671 case SCTP_NOTIFY_ASSOC_UP: 3672 if (stcb->asoc.assoc_up_sent == 0) { 3673 sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, 0, so_locked); 3674 stcb->asoc.assoc_up_sent = 1; 3675 } 3676 if (stcb->asoc.adaptation_needed && (stcb->asoc.adaptation_sent == 0)) { 3677 sctp_notify_adaptation_layer(stcb); 3678 } 3679 if (stcb->asoc.auth_supported == 0) { 3680 sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, 3681 NULL, so_locked); 3682 } 3683 break; 3684 case SCTP_NOTIFY_ASSOC_DOWN: 3685 sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, 0, so_locked); 3686 break; 3687 case SCTP_NOTIFY_INTERFACE_DOWN: 3688 { 3689 struct sctp_nets *net; 3690 3691 net = (struct sctp_nets *)data; 3692 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_UNREACHABLE, 3693 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3694 break; 3695 } 3696 case SCTP_NOTIFY_INTERFACE_UP: 3697 { 3698 struct sctp_nets *net; 3699 3700 net = (struct sctp_nets *)data; 3701 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_AVAILABLE, 3702 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3703 break; 3704 } 3705 case SCTP_NOTIFY_INTERFACE_CONFIRMED: 3706 { 3707 struct sctp_nets *net; 3708 3709 net = (struct sctp_nets *)data; 3710 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_CONFIRMED, 3711 (struct sockaddr *)&net->ro._l_addr, error, so_locked); 3712 break; 3713 } 3714 case SCTP_NOTIFY_SPECIAL_SP_FAIL: 3715 sctp_notify_send_failed2(stcb, error, 3716 (struct sctp_stream_queue_pending *)data, so_locked); 3717 break; 3718 case SCTP_NOTIFY_SENT_DG_FAIL: 3719 sctp_notify_send_failed(stcb, 1, error, 3720 (struct sctp_tmit_chunk *)data, so_locked); 3721 break; 3722 case SCTP_NOTIFY_UNSENT_DG_FAIL: 3723 sctp_notify_send_failed(stcb, 0, error, 3724 (struct sctp_tmit_chunk *)data, so_locked); 3725 break; 3726 case SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION: 3727 { 3728 uint32_t val; 3729 3730 val = *((uint32_t *)data); 3731 3732 sctp_notify_partial_delivery_indication(stcb, error, val, so_locked); 3733 break; 3734 } 3735 case SCTP_NOTIFY_ASSOC_LOC_ABORTED: 3736 if (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || 3737 ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED)) { 3738 sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 0, so_locked); 3739 } else { 3740 sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 0, so_locked); 3741 } 3742 break; 3743 case SCTP_NOTIFY_ASSOC_REM_ABORTED: 3744 if (((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT) || 3745 ((stcb->asoc.state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED)) { 3746 sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 1, so_locked); 3747 } else { 3748 sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 1, so_locked); 3749 } 3750 break; 3751 case SCTP_NOTIFY_ASSOC_RESTART: 3752 sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, 0, so_locked); 3753 if (stcb->asoc.auth_supported == 0) { 3754 sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, 3755 NULL, so_locked); 3756 } 3757 break; 3758 case SCTP_NOTIFY_STR_RESET_SEND: 3759 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_OUTGOING_SSN); 3760 break; 3761 case SCTP_NOTIFY_STR_RESET_RECV: 3762 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_INCOMING); 3763 break; 3764 case SCTP_NOTIFY_STR_RESET_FAILED_OUT: 3765 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3766 (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_FAILED)); 3767 break; 3768 case SCTP_NOTIFY_STR_RESET_DENIED_OUT: 3769 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3770 (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_DENIED)); 3771 break; 3772 case SCTP_NOTIFY_STR_RESET_FAILED_IN: 3773 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3774 (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_FAILED)); 3775 break; 3776 case SCTP_NOTIFY_STR_RESET_DENIED_IN: 3777 sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), 3778 (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_DENIED)); 3779 break; 3780 case SCTP_NOTIFY_ASCONF_ADD_IP: 3781 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data, 3782 error, so_locked); 3783 break; 3784 case SCTP_NOTIFY_ASCONF_DELETE_IP: 3785 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_REMOVED, data, 3786 error, so_locked); 3787 break; 3788 case SCTP_NOTIFY_ASCONF_SET_PRIMARY: 3789 sctp_notify_peer_addr_change(stcb, SCTP_ADDR_MADE_PRIM, data, 3790 error, so_locked); 3791 break; 3792 case SCTP_NOTIFY_PEER_SHUTDOWN: 3793 sctp_notify_shutdown_event(stcb); 3794 break; 3795 case SCTP_NOTIFY_AUTH_NEW_KEY: 3796 sctp_notify_authentication(stcb, SCTP_AUTH_NEW_KEY, error, 3797 (uint16_t)(uintptr_t)data, 3798 so_locked); 3799 break; 3800 case SCTP_NOTIFY_AUTH_FREE_KEY: 3801 sctp_notify_authentication(stcb, SCTP_AUTH_FREE_KEY, error, 3802 (uint16_t)(uintptr_t)data, 3803 so_locked); 3804 break; 3805 case SCTP_NOTIFY_NO_PEER_AUTH: 3806 sctp_notify_authentication(stcb, SCTP_AUTH_NO_AUTH, error, 3807 (uint16_t)(uintptr_t)data, 3808 so_locked); 3809 break; 3810 case SCTP_NOTIFY_SENDER_DRY: 3811 sctp_notify_sender_dry_event(stcb, so_locked); 3812 break; 3813 case SCTP_NOTIFY_REMOTE_ERROR: 3814 sctp_notify_remote_error(stcb, error, data); 3815 break; 3816 default: 3817 SCTPDBG(SCTP_DEBUG_UTIL1, "%s: unknown notification %xh (%u)\n", 3818 __func__, notification, notification); 3819 break; 3820 } /* end switch */ 3821 } 3822 3823 void 3824 sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock, int so_locked 3825 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3826 SCTP_UNUSED 3827 #endif 3828 ) 3829 { 3830 struct sctp_association *asoc; 3831 struct sctp_stream_out *outs; 3832 struct sctp_tmit_chunk *chk, *nchk; 3833 struct sctp_stream_queue_pending *sp, *nsp; 3834 int i; 3835 3836 if (stcb == NULL) { 3837 return; 3838 } 3839 asoc = &stcb->asoc; 3840 if (asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) { 3841 /* already being freed */ 3842 return; 3843 } 3844 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3845 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3846 (asoc->state & SCTP_STATE_CLOSED_SOCKET)) { 3847 return; 3848 } 3849 /* now through all the gunk freeing chunks */ 3850 if (holds_lock == 0) { 3851 SCTP_TCB_SEND_LOCK(stcb); 3852 } 3853 /* sent queue SHOULD be empty */ 3854 TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) { 3855 TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next); 3856 asoc->sent_queue_cnt--; 3857 if (chk->sent != SCTP_DATAGRAM_NR_ACKED) { 3858 if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) { 3859 asoc->strmout[chk->rec.data.sid].chunks_on_queues--; 3860 #ifdef INVARIANTS 3861 } else { 3862 panic("No chunks on the queues for sid %u.", chk->rec.data.sid); 3863 #endif 3864 } 3865 } 3866 if (chk->data != NULL) { 3867 sctp_free_bufspace(stcb, asoc, chk, 1); 3868 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 3869 error, chk, so_locked); 3870 if (chk->data) { 3871 sctp_m_freem(chk->data); 3872 chk->data = NULL; 3873 } 3874 } 3875 sctp_free_a_chunk(stcb, chk, so_locked); 3876 /* sa_ignore FREED_MEMORY */ 3877 } 3878 /* pending send queue SHOULD be empty */ 3879 TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) { 3880 TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next); 3881 asoc->send_queue_cnt--; 3882 if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) { 3883 asoc->strmout[chk->rec.data.sid].chunks_on_queues--; 3884 #ifdef INVARIANTS 3885 } else { 3886 panic("No chunks on the queues for sid %u.", chk->rec.data.sid); 3887 #endif 3888 } 3889 if (chk->data != NULL) { 3890 sctp_free_bufspace(stcb, asoc, chk, 1); 3891 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 3892 error, chk, so_locked); 3893 if (chk->data) { 3894 sctp_m_freem(chk->data); 3895 chk->data = NULL; 3896 } 3897 } 3898 sctp_free_a_chunk(stcb, chk, so_locked); 3899 /* sa_ignore FREED_MEMORY */ 3900 } 3901 for (i = 0; i < asoc->streamoutcnt; i++) { 3902 /* For each stream */ 3903 outs = &asoc->strmout[i]; 3904 /* clean up any sends there */ 3905 TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) { 3906 atomic_subtract_int(&asoc->stream_queue_cnt, 1); 3907 TAILQ_REMOVE(&outs->outqueue, sp, next); 3908 stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, holds_lock); 3909 sctp_free_spbufspace(stcb, asoc, sp); 3910 if (sp->data) { 3911 sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, 3912 error, (void *)sp, so_locked); 3913 if (sp->data) { 3914 sctp_m_freem(sp->data); 3915 sp->data = NULL; 3916 sp->tail_mbuf = NULL; 3917 sp->length = 0; 3918 } 3919 } 3920 if (sp->net) { 3921 sctp_free_remote_addr(sp->net); 3922 sp->net = NULL; 3923 } 3924 /* Free the chunk */ 3925 sctp_free_a_strmoq(stcb, sp, so_locked); 3926 /* sa_ignore FREED_MEMORY */ 3927 } 3928 } 3929 3930 if (holds_lock == 0) { 3931 SCTP_TCB_SEND_UNLOCK(stcb); 3932 } 3933 } 3934 3935 void 3936 sctp_abort_notification(struct sctp_tcb *stcb, uint8_t from_peer, uint16_t error, 3937 struct sctp_abort_chunk *abort, int so_locked 3938 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 3939 SCTP_UNUSED 3940 #endif 3941 ) 3942 { 3943 if (stcb == NULL) { 3944 return; 3945 } 3946 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || 3947 ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && 3948 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { 3949 stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED; 3950 } 3951 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 3952 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || 3953 (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { 3954 return; 3955 } 3956 /* Tell them we lost the asoc */ 3957 sctp_report_all_outbound(stcb, error, 1, so_locked); 3958 if (from_peer) { 3959 sctp_ulp_notify(SCTP_NOTIFY_ASSOC_REM_ABORTED, stcb, error, abort, so_locked); 3960 } else { 3961 sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked); 3962 } 3963 } 3964 3965 void 3966 sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 3967 struct mbuf *m, int iphlen, 3968 struct sockaddr *src, struct sockaddr *dst, 3969 struct sctphdr *sh, struct mbuf *op_err, 3970 uint8_t mflowtype, uint32_t mflowid, 3971 uint32_t vrf_id, uint16_t port) 3972 { 3973 uint32_t vtag; 3974 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3975 struct socket *so; 3976 #endif 3977 3978 vtag = 0; 3979 if (stcb != NULL) { 3980 vtag = stcb->asoc.peer_vtag; 3981 vrf_id = stcb->asoc.vrf_id; 3982 } 3983 sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err, 3984 mflowtype, mflowid, inp->fibnum, 3985 vrf_id, port); 3986 if (stcb != NULL) { 3987 /* We have a TCB to abort, send notification too */ 3988 sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); 3989 stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; 3990 /* Ok, now lets free it */ 3991 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 3992 so = SCTP_INP_SO(inp); 3993 atomic_add_int(&stcb->asoc.refcnt, 1); 3994 SCTP_TCB_UNLOCK(stcb); 3995 SCTP_SOCKET_LOCK(so, 1); 3996 SCTP_TCB_LOCK(stcb); 3997 atomic_subtract_int(&stcb->asoc.refcnt, 1); 3998 #endif 3999 SCTP_STAT_INCR_COUNTER32(sctps_aborted); 4000 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || 4001 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { 4002 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 4003 } 4004 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 4005 SCTP_FROM_SCTPUTIL + SCTP_LOC_4); 4006 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4007 SCTP_SOCKET_UNLOCK(so, 1); 4008 #endif 4009 } 4010 } 4011 #ifdef SCTP_ASOCLOG_OF_TSNS 4012 void 4013 sctp_print_out_track_log(struct sctp_tcb *stcb) 4014 { 4015 #ifdef NOSIY_PRINTS 4016 int i; 4017 4018 SCTP_PRINTF("Last ep reason:%x\n", stcb->sctp_ep->last_abort_code); 4019 SCTP_PRINTF("IN bound TSN log-aaa\n"); 4020 if ((stcb->asoc.tsn_in_at == 0) && (stcb->asoc.tsn_in_wrapped == 0)) { 4021 SCTP_PRINTF("None rcvd\n"); 4022 goto none_in; 4023 } 4024 if (stcb->asoc.tsn_in_wrapped) { 4025 for (i = stcb->asoc.tsn_in_at; i < SCTP_TSN_LOG_SIZE; i++) { 4026 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4027 stcb->asoc.in_tsnlog[i].tsn, 4028 stcb->asoc.in_tsnlog[i].strm, 4029 stcb->asoc.in_tsnlog[i].seq, 4030 stcb->asoc.in_tsnlog[i].flgs, 4031 stcb->asoc.in_tsnlog[i].sz); 4032 } 4033 } 4034 if (stcb->asoc.tsn_in_at) { 4035 for (i = 0; i < stcb->asoc.tsn_in_at; i++) { 4036 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4037 stcb->asoc.in_tsnlog[i].tsn, 4038 stcb->asoc.in_tsnlog[i].strm, 4039 stcb->asoc.in_tsnlog[i].seq, 4040 stcb->asoc.in_tsnlog[i].flgs, 4041 stcb->asoc.in_tsnlog[i].sz); 4042 } 4043 } 4044 none_in: 4045 SCTP_PRINTF("OUT bound TSN log-aaa\n"); 4046 if ((stcb->asoc.tsn_out_at == 0) && 4047 (stcb->asoc.tsn_out_wrapped == 0)) { 4048 SCTP_PRINTF("None sent\n"); 4049 } 4050 if (stcb->asoc.tsn_out_wrapped) { 4051 for (i = stcb->asoc.tsn_out_at; i < SCTP_TSN_LOG_SIZE; i++) { 4052 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4053 stcb->asoc.out_tsnlog[i].tsn, 4054 stcb->asoc.out_tsnlog[i].strm, 4055 stcb->asoc.out_tsnlog[i].seq, 4056 stcb->asoc.out_tsnlog[i].flgs, 4057 stcb->asoc.out_tsnlog[i].sz); 4058 } 4059 } 4060 if (stcb->asoc.tsn_out_at) { 4061 for (i = 0; i < stcb->asoc.tsn_out_at; i++) { 4062 SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n", 4063 stcb->asoc.out_tsnlog[i].tsn, 4064 stcb->asoc.out_tsnlog[i].strm, 4065 stcb->asoc.out_tsnlog[i].seq, 4066 stcb->asoc.out_tsnlog[i].flgs, 4067 stcb->asoc.out_tsnlog[i].sz); 4068 } 4069 } 4070 #endif 4071 } 4072 #endif 4073 4074 void 4075 sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, 4076 struct mbuf *op_err, 4077 int so_locked 4078 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4079 SCTP_UNUSED 4080 #endif 4081 ) 4082 { 4083 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4084 struct socket *so; 4085 #endif 4086 4087 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4088 so = SCTP_INP_SO(inp); 4089 #endif 4090 if (stcb == NULL) { 4091 /* Got to have a TCB */ 4092 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 4093 if (LIST_EMPTY(&inp->sctp_asoc_list)) { 4094 sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, 4095 SCTP_CALLED_DIRECTLY_NOCMPSET); 4096 } 4097 } 4098 return; 4099 } else { 4100 stcb->asoc.state |= SCTP_STATE_WAS_ABORTED; 4101 } 4102 /* notify the peer */ 4103 sctp_send_abort_tcb(stcb, op_err, so_locked); 4104 SCTP_STAT_INCR_COUNTER32(sctps_aborted); 4105 if ((SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_OPEN) || 4106 (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { 4107 SCTP_STAT_DECR_GAUGE32(sctps_currestab); 4108 } 4109 /* notify the ulp */ 4110 if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { 4111 sctp_abort_notification(stcb, 0, 0, NULL, so_locked); 4112 } 4113 /* now free the asoc */ 4114 #ifdef SCTP_ASOCLOG_OF_TSNS 4115 sctp_print_out_track_log(stcb); 4116 #endif 4117 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4118 if (!so_locked) { 4119 atomic_add_int(&stcb->asoc.refcnt, 1); 4120 SCTP_TCB_UNLOCK(stcb); 4121 SCTP_SOCKET_LOCK(so, 1); 4122 SCTP_TCB_LOCK(stcb); 4123 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4124 } 4125 #endif 4126 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 4127 SCTP_FROM_SCTPUTIL + SCTP_LOC_5); 4128 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4129 if (!so_locked) { 4130 SCTP_SOCKET_UNLOCK(so, 1); 4131 } 4132 #endif 4133 } 4134 4135 void 4136 sctp_handle_ootb(struct mbuf *m, int iphlen, int offset, 4137 struct sockaddr *src, struct sockaddr *dst, 4138 struct sctphdr *sh, struct sctp_inpcb *inp, 4139 struct mbuf *cause, 4140 uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum, 4141 uint32_t vrf_id, uint16_t port) 4142 { 4143 struct sctp_chunkhdr *ch, chunk_buf; 4144 unsigned int chk_length; 4145 int contains_init_chunk; 4146 4147 SCTP_STAT_INCR_COUNTER32(sctps_outoftheblue); 4148 /* Generate a TO address for future reference */ 4149 if (inp && (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) { 4150 if (LIST_EMPTY(&inp->sctp_asoc_list)) { 4151 sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, 4152 SCTP_CALLED_DIRECTLY_NOCMPSET); 4153 } 4154 } 4155 contains_init_chunk = 0; 4156 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4157 sizeof(*ch), (uint8_t *)&chunk_buf); 4158 while (ch != NULL) { 4159 chk_length = ntohs(ch->chunk_length); 4160 if (chk_length < sizeof(*ch)) { 4161 /* break to abort land */ 4162 break; 4163 } 4164 switch (ch->chunk_type) { 4165 case SCTP_INIT: 4166 contains_init_chunk = 1; 4167 break; 4168 case SCTP_PACKET_DROPPED: 4169 /* we don't respond to pkt-dropped */ 4170 return; 4171 case SCTP_ABORT_ASSOCIATION: 4172 /* we don't respond with an ABORT to an ABORT */ 4173 return; 4174 case SCTP_SHUTDOWN_COMPLETE: 4175 /* 4176 * we ignore it since we are not waiting for it and 4177 * peer is gone 4178 */ 4179 return; 4180 case SCTP_SHUTDOWN_ACK: 4181 sctp_send_shutdown_complete2(src, dst, sh, 4182 mflowtype, mflowid, fibnum, 4183 vrf_id, port); 4184 return; 4185 default: 4186 break; 4187 } 4188 offset += SCTP_SIZE32(chk_length); 4189 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4190 sizeof(*ch), (uint8_t *)&chunk_buf); 4191 } 4192 if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) || 4193 ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) && 4194 (contains_init_chunk == 0))) { 4195 sctp_send_abort(m, iphlen, src, dst, sh, 0, cause, 4196 mflowtype, mflowid, fibnum, 4197 vrf_id, port); 4198 } 4199 } 4200 4201 /* 4202 * check the inbound datagram to make sure there is not an abort inside it, 4203 * if there is return 1, else return 0. 4204 */ 4205 int 4206 sctp_is_there_an_abort_here(struct mbuf *m, int iphlen, uint32_t *vtagfill) 4207 { 4208 struct sctp_chunkhdr *ch; 4209 struct sctp_init_chunk *init_chk, chunk_buf; 4210 int offset; 4211 unsigned int chk_length; 4212 4213 offset = iphlen + sizeof(struct sctphdr); 4214 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, sizeof(*ch), 4215 (uint8_t *)&chunk_buf); 4216 while (ch != NULL) { 4217 chk_length = ntohs(ch->chunk_length); 4218 if (chk_length < sizeof(*ch)) { 4219 /* packet is probably corrupt */ 4220 break; 4221 } 4222 /* we seem to be ok, is it an abort? */ 4223 if (ch->chunk_type == SCTP_ABORT_ASSOCIATION) { 4224 /* yep, tell them */ 4225 return (1); 4226 } 4227 if (ch->chunk_type == SCTP_INITIATION) { 4228 /* need to update the Vtag */ 4229 init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m, 4230 offset, sizeof(*init_chk), (uint8_t *)&chunk_buf); 4231 if (init_chk != NULL) { 4232 *vtagfill = ntohl(init_chk->init.initiate_tag); 4233 } 4234 } 4235 /* Nope, move to the next chunk */ 4236 offset += SCTP_SIZE32(chk_length); 4237 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, 4238 sizeof(*ch), (uint8_t *)&chunk_buf); 4239 } 4240 return (0); 4241 } 4242 4243 /* 4244 * currently (2/02), ifa_addr embeds scope_id's and don't have sin6_scope_id 4245 * set (i.e. it's 0) so, create this function to compare link local scopes 4246 */ 4247 #ifdef INET6 4248 uint32_t 4249 sctp_is_same_scope(struct sockaddr_in6 *addr1, struct sockaddr_in6 *addr2) 4250 { 4251 struct sockaddr_in6 a, b; 4252 4253 /* save copies */ 4254 a = *addr1; 4255 b = *addr2; 4256 4257 if (a.sin6_scope_id == 0) 4258 if (sa6_recoverscope(&a)) { 4259 /* can't get scope, so can't match */ 4260 return (0); 4261 } 4262 if (b.sin6_scope_id == 0) 4263 if (sa6_recoverscope(&b)) { 4264 /* can't get scope, so can't match */ 4265 return (0); 4266 } 4267 if (a.sin6_scope_id != b.sin6_scope_id) 4268 return (0); 4269 4270 return (1); 4271 } 4272 4273 /* 4274 * returns a sockaddr_in6 with embedded scope recovered and removed 4275 */ 4276 struct sockaddr_in6 * 4277 sctp_recover_scope(struct sockaddr_in6 *addr, struct sockaddr_in6 *store) 4278 { 4279 /* check and strip embedded scope junk */ 4280 if (addr->sin6_family == AF_INET6) { 4281 if (IN6_IS_SCOPE_LINKLOCAL(&addr->sin6_addr)) { 4282 if (addr->sin6_scope_id == 0) { 4283 *store = *addr; 4284 if (!sa6_recoverscope(store)) { 4285 /* use the recovered scope */ 4286 addr = store; 4287 } 4288 } else { 4289 /* else, return the original "to" addr */ 4290 in6_clearscope(&addr->sin6_addr); 4291 } 4292 } 4293 } 4294 return (addr); 4295 } 4296 #endif 4297 4298 /* 4299 * are the two addresses the same? currently a "scopeless" check returns: 1 4300 * if same, 0 if not 4301 */ 4302 int 4303 sctp_cmpaddr(struct sockaddr *sa1, struct sockaddr *sa2) 4304 { 4305 4306 /* must be valid */ 4307 if (sa1 == NULL || sa2 == NULL) 4308 return (0); 4309 4310 /* must be the same family */ 4311 if (sa1->sa_family != sa2->sa_family) 4312 return (0); 4313 4314 switch (sa1->sa_family) { 4315 #ifdef INET6 4316 case AF_INET6: 4317 { 4318 /* IPv6 addresses */ 4319 struct sockaddr_in6 *sin6_1, *sin6_2; 4320 4321 sin6_1 = (struct sockaddr_in6 *)sa1; 4322 sin6_2 = (struct sockaddr_in6 *)sa2; 4323 return (SCTP6_ARE_ADDR_EQUAL(sin6_1, 4324 sin6_2)); 4325 } 4326 #endif 4327 #ifdef INET 4328 case AF_INET: 4329 { 4330 /* IPv4 addresses */ 4331 struct sockaddr_in *sin_1, *sin_2; 4332 4333 sin_1 = (struct sockaddr_in *)sa1; 4334 sin_2 = (struct sockaddr_in *)sa2; 4335 return (sin_1->sin_addr.s_addr == sin_2->sin_addr.s_addr); 4336 } 4337 #endif 4338 default: 4339 /* we don't do these... */ 4340 return (0); 4341 } 4342 } 4343 4344 void 4345 sctp_print_address(struct sockaddr *sa) 4346 { 4347 #ifdef INET6 4348 char ip6buf[INET6_ADDRSTRLEN]; 4349 #endif 4350 4351 switch (sa->sa_family) { 4352 #ifdef INET6 4353 case AF_INET6: 4354 { 4355 struct sockaddr_in6 *sin6; 4356 4357 sin6 = (struct sockaddr_in6 *)sa; 4358 SCTP_PRINTF("IPv6 address: %s:port:%d scope:%u\n", 4359 ip6_sprintf(ip6buf, &sin6->sin6_addr), 4360 ntohs(sin6->sin6_port), 4361 sin6->sin6_scope_id); 4362 break; 4363 } 4364 #endif 4365 #ifdef INET 4366 case AF_INET: 4367 { 4368 struct sockaddr_in *sin; 4369 unsigned char *p; 4370 4371 sin = (struct sockaddr_in *)sa; 4372 p = (unsigned char *)&sin->sin_addr; 4373 SCTP_PRINTF("IPv4 address: %u.%u.%u.%u:%d\n", 4374 p[0], p[1], p[2], p[3], ntohs(sin->sin_port)); 4375 break; 4376 } 4377 #endif 4378 default: 4379 SCTP_PRINTF("?\n"); 4380 break; 4381 } 4382 } 4383 4384 void 4385 sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp, 4386 struct sctp_inpcb *new_inp, 4387 struct sctp_tcb *stcb, 4388 int waitflags) 4389 { 4390 /* 4391 * go through our old INP and pull off any control structures that 4392 * belong to stcb and move then to the new inp. 4393 */ 4394 struct socket *old_so, *new_so; 4395 struct sctp_queued_to_read *control, *nctl; 4396 struct sctp_readhead tmp_queue; 4397 struct mbuf *m; 4398 int error = 0; 4399 4400 old_so = old_inp->sctp_socket; 4401 new_so = new_inp->sctp_socket; 4402 TAILQ_INIT(&tmp_queue); 4403 error = sblock(&old_so->so_rcv, waitflags); 4404 if (error) { 4405 /* 4406 * Gak, can't get sblock, we have a problem. data will be 4407 * left stranded.. and we don't dare look at it since the 4408 * other thread may be reading something. Oh well, its a 4409 * screwed up app that does a peeloff OR a accept while 4410 * reading from the main socket... actually its only the 4411 * peeloff() case, since I think read will fail on a 4412 * listening socket.. 4413 */ 4414 return; 4415 } 4416 /* lock the socket buffers */ 4417 SCTP_INP_READ_LOCK(old_inp); 4418 TAILQ_FOREACH_SAFE(control, &old_inp->read_queue, next, nctl) { 4419 /* Pull off all for out target stcb */ 4420 if (control->stcb == stcb) { 4421 /* remove it we want it */ 4422 TAILQ_REMOVE(&old_inp->read_queue, control, next); 4423 TAILQ_INSERT_TAIL(&tmp_queue, control, next); 4424 m = control->data; 4425 while (m) { 4426 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4427 sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 4428 } 4429 sctp_sbfree(control, stcb, &old_so->so_rcv, m); 4430 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4431 sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4432 } 4433 m = SCTP_BUF_NEXT(m); 4434 } 4435 } 4436 } 4437 SCTP_INP_READ_UNLOCK(old_inp); 4438 /* Remove the sb-lock on the old socket */ 4439 4440 sbunlock(&old_so->so_rcv); 4441 /* Now we move them over to the new socket buffer */ 4442 SCTP_INP_READ_LOCK(new_inp); 4443 TAILQ_FOREACH_SAFE(control, &tmp_queue, next, nctl) { 4444 TAILQ_INSERT_TAIL(&new_inp->read_queue, control, next); 4445 m = control->data; 4446 while (m) { 4447 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4448 sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m)); 4449 } 4450 sctp_sballoc(stcb, &new_so->so_rcv, m); 4451 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4452 sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4453 } 4454 m = SCTP_BUF_NEXT(m); 4455 } 4456 } 4457 SCTP_INP_READ_UNLOCK(new_inp); 4458 } 4459 4460 void 4461 sctp_wakeup_the_read_socket(struct sctp_inpcb *inp, 4462 struct sctp_tcb *stcb, 4463 int so_locked 4464 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4465 SCTP_UNUSED 4466 #endif 4467 ) 4468 { 4469 if ((inp != NULL) && (inp->sctp_socket != NULL)) { 4470 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_ZERO_COPY_ACTIVE)) { 4471 SCTP_ZERO_COPY_EVENT(inp, inp->sctp_socket); 4472 } else { 4473 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4474 struct socket *so; 4475 4476 so = SCTP_INP_SO(inp); 4477 if (!so_locked) { 4478 if (stcb) { 4479 atomic_add_int(&stcb->asoc.refcnt, 1); 4480 SCTP_TCB_UNLOCK(stcb); 4481 } 4482 SCTP_SOCKET_LOCK(so, 1); 4483 if (stcb) { 4484 SCTP_TCB_LOCK(stcb); 4485 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4486 } 4487 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 4488 SCTP_SOCKET_UNLOCK(so, 1); 4489 return; 4490 } 4491 } 4492 #endif 4493 sctp_sorwakeup(inp, inp->sctp_socket); 4494 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4495 if (!so_locked) { 4496 SCTP_SOCKET_UNLOCK(so, 1); 4497 } 4498 #endif 4499 } 4500 } 4501 } 4502 4503 void 4504 sctp_add_to_readq(struct sctp_inpcb *inp, 4505 struct sctp_tcb *stcb, 4506 struct sctp_queued_to_read *control, 4507 struct sockbuf *sb, 4508 int end, 4509 int inp_read_lock_held, 4510 int so_locked 4511 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4512 SCTP_UNUSED 4513 #endif 4514 ) 4515 { 4516 /* 4517 * Here we must place the control on the end of the socket read 4518 * queue AND increment sb_cc so that select will work properly on 4519 * read. 4520 */ 4521 struct mbuf *m, *prev = NULL; 4522 4523 if (inp == NULL) { 4524 /* Gak, TSNH!! */ 4525 #ifdef INVARIANTS 4526 panic("Gak, inp NULL on add_to_readq"); 4527 #endif 4528 return; 4529 } 4530 if (inp_read_lock_held == 0) 4531 SCTP_INP_READ_LOCK(inp); 4532 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) { 4533 sctp_free_remote_addr(control->whoFrom); 4534 if (control->data) { 4535 sctp_m_freem(control->data); 4536 control->data = NULL; 4537 } 4538 sctp_free_a_readq(stcb, control); 4539 if (inp_read_lock_held == 0) 4540 SCTP_INP_READ_UNLOCK(inp); 4541 return; 4542 } 4543 if (!(control->spec_flags & M_NOTIFICATION)) { 4544 atomic_add_int(&inp->total_recvs, 1); 4545 if (!control->do_not_ref_stcb) { 4546 atomic_add_int(&stcb->total_recvs, 1); 4547 } 4548 } 4549 m = control->data; 4550 control->held_length = 0; 4551 control->length = 0; 4552 while (m) { 4553 if (SCTP_BUF_LEN(m) == 0) { 4554 /* Skip mbufs with NO length */ 4555 if (prev == NULL) { 4556 /* First one */ 4557 control->data = sctp_m_free(m); 4558 m = control->data; 4559 } else { 4560 SCTP_BUF_NEXT(prev) = sctp_m_free(m); 4561 m = SCTP_BUF_NEXT(prev); 4562 } 4563 if (m == NULL) { 4564 control->tail_mbuf = prev; 4565 } 4566 continue; 4567 } 4568 prev = m; 4569 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4570 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m)); 4571 } 4572 sctp_sballoc(stcb, sb, m); 4573 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 4574 sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 4575 } 4576 atomic_add_int(&control->length, SCTP_BUF_LEN(m)); 4577 m = SCTP_BUF_NEXT(m); 4578 } 4579 if (prev != NULL) { 4580 control->tail_mbuf = prev; 4581 } else { 4582 /* Everything got collapsed out?? */ 4583 sctp_free_remote_addr(control->whoFrom); 4584 sctp_free_a_readq(stcb, control); 4585 if (inp_read_lock_held == 0) 4586 SCTP_INP_READ_UNLOCK(inp); 4587 return; 4588 } 4589 if (end) { 4590 control->end_added = 1; 4591 } 4592 TAILQ_INSERT_TAIL(&inp->read_queue, control, next); 4593 control->on_read_q = 1; 4594 if (inp_read_lock_held == 0) 4595 SCTP_INP_READ_UNLOCK(inp); 4596 if (inp && inp->sctp_socket) { 4597 sctp_wakeup_the_read_socket(inp, stcb, so_locked); 4598 } 4599 } 4600 4601 /*************HOLD THIS COMMENT FOR PATCH FILE OF 4602 *************ALTERNATE ROUTING CODE 4603 */ 4604 4605 /*************HOLD THIS COMMENT FOR END OF PATCH FILE OF 4606 *************ALTERNATE ROUTING CODE 4607 */ 4608 4609 struct mbuf * 4610 sctp_generate_cause(uint16_t code, char *info) 4611 { 4612 struct mbuf *m; 4613 struct sctp_gen_error_cause *cause; 4614 size_t info_len; 4615 uint16_t len; 4616 4617 if ((code == 0) || (info == NULL)) { 4618 return (NULL); 4619 } 4620 info_len = strlen(info); 4621 if (info_len > (SCTP_MAX_CAUSE_LENGTH - sizeof(struct sctp_paramhdr))) { 4622 return (NULL); 4623 } 4624 len = (uint16_t)(sizeof(struct sctp_paramhdr) + info_len); 4625 m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA); 4626 if (m != NULL) { 4627 SCTP_BUF_LEN(m) = len; 4628 cause = mtod(m, struct sctp_gen_error_cause *); 4629 cause->code = htons(code); 4630 cause->length = htons(len); 4631 memcpy(cause->info, info, info_len); 4632 } 4633 return (m); 4634 } 4635 4636 struct mbuf * 4637 sctp_generate_no_user_data_cause(uint32_t tsn) 4638 { 4639 struct mbuf *m; 4640 struct sctp_error_no_user_data *no_user_data_cause; 4641 uint16_t len; 4642 4643 len = (uint16_t)sizeof(struct sctp_error_no_user_data); 4644 m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA); 4645 if (m != NULL) { 4646 SCTP_BUF_LEN(m) = len; 4647 no_user_data_cause = mtod(m, struct sctp_error_no_user_data *); 4648 no_user_data_cause->cause.code = htons(SCTP_CAUSE_NO_USER_DATA); 4649 no_user_data_cause->cause.length = htons(len); 4650 no_user_data_cause->tsn = htonl(tsn); 4651 } 4652 return (m); 4653 } 4654 4655 #ifdef SCTP_MBCNT_LOGGING 4656 void 4657 sctp_free_bufspace(struct sctp_tcb *stcb, struct sctp_association *asoc, 4658 struct sctp_tmit_chunk *tp1, int chk_cnt) 4659 { 4660 if (tp1->data == NULL) { 4661 return; 4662 } 4663 asoc->chunks_on_out_queue -= chk_cnt; 4664 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBCNT_LOGGING_ENABLE) { 4665 sctp_log_mbcnt(SCTP_LOG_MBCNT_DECREASE, 4666 asoc->total_output_queue_size, 4667 tp1->book_size, 4668 0, 4669 tp1->mbcnt); 4670 } 4671 if (asoc->total_output_queue_size >= tp1->book_size) { 4672 atomic_add_int(&asoc->total_output_queue_size, -tp1->book_size); 4673 } else { 4674 asoc->total_output_queue_size = 0; 4675 } 4676 4677 if (stcb->sctp_socket && (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) || 4678 ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)))) { 4679 if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) { 4680 stcb->sctp_socket->so_snd.sb_cc -= tp1->book_size; 4681 } else { 4682 stcb->sctp_socket->so_snd.sb_cc = 0; 4683 4684 } 4685 } 4686 } 4687 4688 #endif 4689 4690 int 4691 sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, 4692 uint8_t sent, int so_locked 4693 #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 4694 SCTP_UNUSED 4695 #endif 4696 ) 4697 { 4698 struct sctp_stream_out *strq; 4699 struct sctp_tmit_chunk *chk = NULL, *tp2; 4700 struct sctp_stream_queue_pending *sp; 4701 uint32_t mid; 4702 uint16_t sid; 4703 uint8_t foundeom = 0; 4704 int ret_sz = 0; 4705 int notdone; 4706 int do_wakeup_routine = 0; 4707 4708 sid = tp1->rec.data.sid; 4709 mid = tp1->rec.data.mid; 4710 if (sent || !(tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG)) { 4711 stcb->asoc.abandoned_sent[0]++; 4712 stcb->asoc.abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++; 4713 stcb->asoc.strmout[sid].abandoned_sent[0]++; 4714 #if defined(SCTP_DETAILED_STR_STATS) 4715 stcb->asoc.strmout[stream].abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++; 4716 #endif 4717 } else { 4718 stcb->asoc.abandoned_unsent[0]++; 4719 stcb->asoc.abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++; 4720 stcb->asoc.strmout[sid].abandoned_unsent[0]++; 4721 #if defined(SCTP_DETAILED_STR_STATS) 4722 stcb->asoc.strmout[stream].abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++; 4723 #endif 4724 } 4725 do { 4726 ret_sz += tp1->book_size; 4727 if (tp1->data != NULL) { 4728 if (tp1->sent < SCTP_DATAGRAM_RESEND) { 4729 sctp_flight_size_decrease(tp1); 4730 sctp_total_flight_decrease(stcb, tp1); 4731 } 4732 sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); 4733 stcb->asoc.peers_rwnd += tp1->send_size; 4734 stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh); 4735 if (sent) { 4736 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); 4737 } else { 4738 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); 4739 } 4740 if (tp1->data) { 4741 sctp_m_freem(tp1->data); 4742 tp1->data = NULL; 4743 } 4744 do_wakeup_routine = 1; 4745 if (PR_SCTP_BUF_ENABLED(tp1->flags)) { 4746 stcb->asoc.sent_queue_cnt_removeable--; 4747 } 4748 } 4749 tp1->sent = SCTP_FORWARD_TSN_SKIP; 4750 if ((tp1->rec.data.rcv_flags & SCTP_DATA_NOT_FRAG) == 4751 SCTP_DATA_NOT_FRAG) { 4752 /* not frag'ed we ae done */ 4753 notdone = 0; 4754 foundeom = 1; 4755 } else if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { 4756 /* end of frag, we are done */ 4757 notdone = 0; 4758 foundeom = 1; 4759 } else { 4760 /* 4761 * Its a begin or middle piece, we must mark all of 4762 * it 4763 */ 4764 notdone = 1; 4765 tp1 = TAILQ_NEXT(tp1, sctp_next); 4766 } 4767 } while (tp1 && notdone); 4768 if (foundeom == 0) { 4769 /* 4770 * The multi-part message was scattered across the send and 4771 * sent queue. 4772 */ 4773 TAILQ_FOREACH_SAFE(tp1, &stcb->asoc.send_queue, sctp_next, tp2) { 4774 if ((tp1->rec.data.sid != sid) || 4775 (!SCTP_MID_EQ(stcb->asoc.idata_supported, tp1->rec.data.mid, mid))) { 4776 break; 4777 } 4778 /* 4779 * save to chk in case we have some on stream out 4780 * queue. If so and we have an un-transmitted one we 4781 * don't have to fudge the TSN. 4782 */ 4783 chk = tp1; 4784 ret_sz += tp1->book_size; 4785 sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1); 4786 if (sent) { 4787 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked); 4788 } else { 4789 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked); 4790 } 4791 if (tp1->data) { 4792 sctp_m_freem(tp1->data); 4793 tp1->data = NULL; 4794 } 4795 /* No flight involved here book the size to 0 */ 4796 tp1->book_size = 0; 4797 if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { 4798 foundeom = 1; 4799 } 4800 do_wakeup_routine = 1; 4801 tp1->sent = SCTP_FORWARD_TSN_SKIP; 4802 TAILQ_REMOVE(&stcb->asoc.send_queue, tp1, sctp_next); 4803 /* 4804 * on to the sent queue so we can wait for it to be 4805 * passed by. 4806 */ 4807 TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, tp1, 4808 sctp_next); 4809 stcb->asoc.send_queue_cnt--; 4810 stcb->asoc.sent_queue_cnt++; 4811 } 4812 } 4813 if (foundeom == 0) { 4814 /* 4815 * Still no eom found. That means there is stuff left on the 4816 * stream out queue.. yuck. 4817 */ 4818 SCTP_TCB_SEND_LOCK(stcb); 4819 strq = &stcb->asoc.strmout[sid]; 4820 sp = TAILQ_FIRST(&strq->outqueue); 4821 if (sp != NULL) { 4822 sp->discard_rest = 1; 4823 /* 4824 * We may need to put a chunk on the queue that 4825 * holds the TSN that would have been sent with the 4826 * LAST bit. 4827 */ 4828 if (chk == NULL) { 4829 /* Yep, we have to */ 4830 sctp_alloc_a_chunk(stcb, chk); 4831 if (chk == NULL) { 4832 /* 4833 * we are hosed. All we can do is 4834 * nothing.. which will cause an 4835 * abort if the peer is paying 4836 * attention. 4837 */ 4838 goto oh_well; 4839 } 4840 memset(chk, 0, sizeof(*chk)); 4841 chk->rec.data.rcv_flags = 0; 4842 chk->sent = SCTP_FORWARD_TSN_SKIP; 4843 chk->asoc = &stcb->asoc; 4844 if (stcb->asoc.idata_supported == 0) { 4845 if (sp->sinfo_flags & SCTP_UNORDERED) { 4846 chk->rec.data.mid = 0; 4847 } else { 4848 chk->rec.data.mid = strq->next_mid_ordered; 4849 } 4850 } else { 4851 if (sp->sinfo_flags & SCTP_UNORDERED) { 4852 chk->rec.data.mid = strq->next_mid_unordered; 4853 } else { 4854 chk->rec.data.mid = strq->next_mid_ordered; 4855 } 4856 } 4857 chk->rec.data.sid = sp->sid; 4858 chk->rec.data.ppid = sp->ppid; 4859 chk->rec.data.context = sp->context; 4860 chk->flags = sp->act_flags; 4861 chk->whoTo = NULL; 4862 chk->rec.data.tsn = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1); 4863 strq->chunks_on_queues++; 4864 TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, chk, sctp_next); 4865 stcb->asoc.sent_queue_cnt++; 4866 stcb->asoc.pr_sctp_cnt++; 4867 } 4868 chk->rec.data.rcv_flags |= SCTP_DATA_LAST_FRAG; 4869 if (sp->sinfo_flags & SCTP_UNORDERED) { 4870 chk->rec.data.rcv_flags |= SCTP_DATA_UNORDERED; 4871 } 4872 if (stcb->asoc.idata_supported == 0) { 4873 if ((sp->sinfo_flags & SCTP_UNORDERED) == 0) { 4874 strq->next_mid_ordered++; 4875 } 4876 } else { 4877 if (sp->sinfo_flags & SCTP_UNORDERED) { 4878 strq->next_mid_unordered++; 4879 } else { 4880 strq->next_mid_ordered++; 4881 } 4882 } 4883 oh_well: 4884 if (sp->data) { 4885 /* 4886 * Pull any data to free up the SB and allow 4887 * sender to "add more" while we will throw 4888 * away :-) 4889 */ 4890 sctp_free_spbufspace(stcb, &stcb->asoc, sp); 4891 ret_sz += sp->length; 4892 do_wakeup_routine = 1; 4893 sp->some_taken = 1; 4894 sctp_m_freem(sp->data); 4895 sp->data = NULL; 4896 sp->tail_mbuf = NULL; 4897 sp->length = 0; 4898 } 4899 } 4900 SCTP_TCB_SEND_UNLOCK(stcb); 4901 } 4902 if (do_wakeup_routine) { 4903 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4904 struct socket *so; 4905 4906 so = SCTP_INP_SO(stcb->sctp_ep); 4907 if (!so_locked) { 4908 atomic_add_int(&stcb->asoc.refcnt, 1); 4909 SCTP_TCB_UNLOCK(stcb); 4910 SCTP_SOCKET_LOCK(so, 1); 4911 SCTP_TCB_LOCK(stcb); 4912 atomic_subtract_int(&stcb->asoc.refcnt, 1); 4913 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { 4914 /* assoc was freed while we were unlocked */ 4915 SCTP_SOCKET_UNLOCK(so, 1); 4916 return (ret_sz); 4917 } 4918 } 4919 #endif 4920 sctp_sowwakeup(stcb->sctp_ep, stcb->sctp_socket); 4921 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING) 4922 if (!so_locked) { 4923 SCTP_SOCKET_UNLOCK(so, 1); 4924 } 4925 #endif 4926 } 4927 return (ret_sz); 4928 } 4929 4930 /* 4931 * checks to see if the given address, sa, is one that is currently known by 4932 * the kernel note: can't distinguish the same address on multiple interfaces 4933 * and doesn't handle multiple addresses with different zone/scope id's note: 4934 * ifa_ifwithaddr() compares the entire sockaddr struct 4935 */ 4936 struct sctp_ifa * 4937 sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, 4938 int holds_lock) 4939 { 4940 struct sctp_laddr *laddr; 4941 4942 if (holds_lock == 0) { 4943 SCTP_INP_RLOCK(inp); 4944 } 4945 LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 4946 if (laddr->ifa == NULL) 4947 continue; 4948 if (addr->sa_family != laddr->ifa->address.sa.sa_family) 4949 continue; 4950 #ifdef INET 4951 if (addr->sa_family == AF_INET) { 4952 if (((struct sockaddr_in *)addr)->sin_addr.s_addr == 4953 laddr->ifa->address.sin.sin_addr.s_addr) { 4954 /* found him. */ 4955 if (holds_lock == 0) { 4956 SCTP_INP_RUNLOCK(inp); 4957 } 4958 return (laddr->ifa); 4959 break; 4960 } 4961 } 4962 #endif 4963 #ifdef INET6 4964 if (addr->sa_family == AF_INET6) { 4965 if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr, 4966 &laddr->ifa->address.sin6)) { 4967 /* found him. */ 4968 if (holds_lock == 0) { 4969 SCTP_INP_RUNLOCK(inp); 4970 } 4971 return (laddr->ifa); 4972 break; 4973 } 4974 } 4975 #endif 4976 } 4977 if (holds_lock == 0) { 4978 SCTP_INP_RUNLOCK(inp); 4979 } 4980 return (NULL); 4981 } 4982 4983 uint32_t 4984 sctp_get_ifa_hash_val(struct sockaddr *addr) 4985 { 4986 switch (addr->sa_family) { 4987 #ifdef INET 4988 case AF_INET: 4989 { 4990 struct sockaddr_in *sin; 4991 4992 sin = (struct sockaddr_in *)addr; 4993 return (sin->sin_addr.s_addr ^ (sin->sin_addr.s_addr >> 16)); 4994 } 4995 #endif 4996 #ifdef INET6 4997 case AF_INET6: 4998 { 4999 struct sockaddr_in6 *sin6; 5000 uint32_t hash_of_addr; 5001 5002 sin6 = (struct sockaddr_in6 *)addr; 5003 hash_of_addr = (sin6->sin6_addr.s6_addr32[0] + 5004 sin6->sin6_addr.s6_addr32[1] + 5005 sin6->sin6_addr.s6_addr32[2] + 5006 sin6->sin6_addr.s6_addr32[3]); 5007 hash_of_addr = (hash_of_addr ^ (hash_of_addr >> 16)); 5008 return (hash_of_addr); 5009 } 5010 #endif 5011 default: 5012 break; 5013 } 5014 return (0); 5015 } 5016 5017 struct sctp_ifa * 5018 sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock) 5019 { 5020 struct sctp_ifa *sctp_ifap; 5021 struct sctp_vrf *vrf; 5022 struct sctp_ifalist *hash_head; 5023 uint32_t hash_of_addr; 5024 5025 if (holds_lock == 0) 5026 SCTP_IPI_ADDR_RLOCK(); 5027 5028 vrf = sctp_find_vrf(vrf_id); 5029 if (vrf == NULL) { 5030 if (holds_lock == 0) 5031 SCTP_IPI_ADDR_RUNLOCK(); 5032 return (NULL); 5033 } 5034 hash_of_addr = sctp_get_ifa_hash_val(addr); 5035 5036 hash_head = &vrf->vrf_addr_hash[(hash_of_addr & vrf->vrf_addr_hashmark)]; 5037 if (hash_head == NULL) { 5038 SCTP_PRINTF("hash_of_addr:%x mask:%x table:%x - ", 5039 hash_of_addr, (uint32_t)vrf->vrf_addr_hashmark, 5040 (uint32_t)(hash_of_addr & vrf->vrf_addr_hashmark)); 5041 sctp_print_address(addr); 5042 SCTP_PRINTF("No such bucket for address\n"); 5043 if (holds_lock == 0) 5044 SCTP_IPI_ADDR_RUNLOCK(); 5045 5046 return (NULL); 5047 } 5048 LIST_FOREACH(sctp_ifap, hash_head, next_bucket) { 5049 if (addr->sa_family != sctp_ifap->address.sa.sa_family) 5050 continue; 5051 #ifdef INET 5052 if (addr->sa_family == AF_INET) { 5053 if (((struct sockaddr_in *)addr)->sin_addr.s_addr == 5054 sctp_ifap->address.sin.sin_addr.s_addr) { 5055 /* found him. */ 5056 if (holds_lock == 0) 5057 SCTP_IPI_ADDR_RUNLOCK(); 5058 return (sctp_ifap); 5059 break; 5060 } 5061 } 5062 #endif 5063 #ifdef INET6 5064 if (addr->sa_family == AF_INET6) { 5065 if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr, 5066 &sctp_ifap->address.sin6)) { 5067 /* found him. */ 5068 if (holds_lock == 0) 5069 SCTP_IPI_ADDR_RUNLOCK(); 5070 return (sctp_ifap); 5071 break; 5072 } 5073 } 5074 #endif 5075 } 5076 if (holds_lock == 0) 5077 SCTP_IPI_ADDR_RUNLOCK(); 5078 return (NULL); 5079 } 5080 5081 static void 5082 sctp_user_rcvd(struct sctp_tcb *stcb, uint32_t *freed_so_far, int hold_rlock, 5083 uint32_t rwnd_req) 5084 { 5085 /* User pulled some data, do we need a rwnd update? */ 5086 int r_unlocked = 0; 5087 uint32_t dif, rwnd; 5088 struct socket *so = NULL; 5089 5090 if (stcb == NULL) 5091 return; 5092 5093 atomic_add_int(&stcb->asoc.refcnt, 1); 5094 5095 if (stcb->asoc.state & (SCTP_STATE_ABOUT_TO_BE_FREED | 5096 SCTP_STATE_SHUTDOWN_RECEIVED | 5097 SCTP_STATE_SHUTDOWN_ACK_SENT)) { 5098 /* Pre-check If we are freeing no update */ 5099 goto no_lock; 5100 } 5101 SCTP_INP_INCR_REF(stcb->sctp_ep); 5102 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 5103 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { 5104 goto out; 5105 } 5106 so = stcb->sctp_socket; 5107 if (so == NULL) { 5108 goto out; 5109 } 5110 atomic_add_int(&stcb->freed_by_sorcv_sincelast, *freed_so_far); 5111 /* Have you have freed enough to look */ 5112 *freed_so_far = 0; 5113 /* Yep, its worth a look and the lock overhead */ 5114 5115 /* Figure out what the rwnd would be */ 5116 rwnd = sctp_calc_rwnd(stcb, &stcb->asoc); 5117 if (rwnd >= stcb->asoc.my_last_reported_rwnd) { 5118 dif = rwnd - stcb->asoc.my_last_reported_rwnd; 5119 } else { 5120 dif = 0; 5121 } 5122 if (dif >= rwnd_req) { 5123 if (hold_rlock) { 5124 SCTP_INP_READ_UNLOCK(stcb->sctp_ep); 5125 r_unlocked = 1; 5126 } 5127 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5128 /* 5129 * One last check before we allow the guy possibly 5130 * to get in. There is a race, where the guy has not 5131 * reached the gate. In that case 5132 */ 5133 goto out; 5134 } 5135 SCTP_TCB_LOCK(stcb); 5136 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5137 /* No reports here */ 5138 SCTP_TCB_UNLOCK(stcb); 5139 goto out; 5140 } 5141 SCTP_STAT_INCR(sctps_wu_sacks_sent); 5142 sctp_send_sack(stcb, SCTP_SO_LOCKED); 5143 5144 sctp_chunk_output(stcb->sctp_ep, stcb, 5145 SCTP_OUTPUT_FROM_USR_RCVD, SCTP_SO_LOCKED); 5146 /* make sure no timer is running */ 5147 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, 5148 SCTP_FROM_SCTPUTIL + SCTP_LOC_6); 5149 SCTP_TCB_UNLOCK(stcb); 5150 } else { 5151 /* Update how much we have pending */ 5152 stcb->freed_by_sorcv_sincelast = dif; 5153 } 5154 out: 5155 if (so && r_unlocked && hold_rlock) { 5156 SCTP_INP_READ_LOCK(stcb->sctp_ep); 5157 } 5158 SCTP_INP_DECR_REF(stcb->sctp_ep); 5159 no_lock: 5160 atomic_add_int(&stcb->asoc.refcnt, -1); 5161 return; 5162 } 5163 5164 int 5165 sctp_sorecvmsg(struct socket *so, 5166 struct uio *uio, 5167 struct mbuf **mp, 5168 struct sockaddr *from, 5169 int fromlen, 5170 int *msg_flags, 5171 struct sctp_sndrcvinfo *sinfo, 5172 int filling_sinfo) 5173 { 5174 /* 5175 * MSG flags we will look at MSG_DONTWAIT - non-blocking IO. 5176 * MSG_PEEK - Look don't touch :-D (only valid with OUT mbuf copy 5177 * mp=NULL thus uio is the copy method to userland) MSG_WAITALL - ?? 5178 * On the way out we may send out any combination of: 5179 * MSG_NOTIFICATION MSG_EOR 5180 * 5181 */ 5182 struct sctp_inpcb *inp = NULL; 5183 int my_len = 0; 5184 int cp_len = 0, error = 0; 5185 struct sctp_queued_to_read *control = NULL, *ctl = NULL, *nxt = NULL; 5186 struct mbuf *m = NULL; 5187 struct sctp_tcb *stcb = NULL; 5188 int wakeup_read_socket = 0; 5189 int freecnt_applied = 0; 5190 int out_flags = 0, in_flags = 0; 5191 int block_allowed = 1; 5192 uint32_t freed_so_far = 0; 5193 uint32_t copied_so_far = 0; 5194 int in_eeor_mode = 0; 5195 int no_rcv_needed = 0; 5196 uint32_t rwnd_req = 0; 5197 int hold_sblock = 0; 5198 int hold_rlock = 0; 5199 ssize_t slen = 0; 5200 uint32_t held_length = 0; 5201 int sockbuf_lock = 0; 5202 5203 if (uio == NULL) { 5204 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 5205 return (EINVAL); 5206 } 5207 if (msg_flags) { 5208 in_flags = *msg_flags; 5209 if (in_flags & MSG_PEEK) 5210 SCTP_STAT_INCR(sctps_read_peeks); 5211 } else { 5212 in_flags = 0; 5213 } 5214 slen = uio->uio_resid; 5215 5216 /* Pull in and set up our int flags */ 5217 if (in_flags & MSG_OOB) { 5218 /* Out of band's NOT supported */ 5219 return (EOPNOTSUPP); 5220 } 5221 if ((in_flags & MSG_PEEK) && (mp != NULL)) { 5222 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 5223 return (EINVAL); 5224 } 5225 if ((in_flags & (MSG_DONTWAIT 5226 | MSG_NBIO 5227 )) || 5228 SCTP_SO_IS_NBIO(so)) { 5229 block_allowed = 0; 5230 } 5231 /* setup the endpoint */ 5232 inp = (struct sctp_inpcb *)so->so_pcb; 5233 if (inp == NULL) { 5234 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EFAULT); 5235 return (EFAULT); 5236 } 5237 rwnd_req = (SCTP_SB_LIMIT_RCV(so) >> SCTP_RWND_HIWAT_SHIFT); 5238 /* Must be at least a MTU's worth */ 5239 if (rwnd_req < SCTP_MIN_RWND) 5240 rwnd_req = SCTP_MIN_RWND; 5241 in_eeor_mode = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); 5242 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 5243 sctp_misc_ints(SCTP_SORECV_ENTER, 5244 rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); 5245 } 5246 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 5247 sctp_misc_ints(SCTP_SORECV_ENTERPL, 5248 rwnd_req, block_allowed, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); 5249 } 5250 error = sblock(&so->so_rcv, (block_allowed ? SBL_WAIT : 0)); 5251 if (error) { 5252 goto release_unlocked; 5253 } 5254 sockbuf_lock = 1; 5255 restart: 5256 5257 5258 restart_nosblocks: 5259 if (hold_sblock == 0) { 5260 SOCKBUF_LOCK(&so->so_rcv); 5261 hold_sblock = 1; 5262 } 5263 if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || 5264 (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { 5265 goto out; 5266 } 5267 if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) { 5268 if (so->so_error) { 5269 error = so->so_error; 5270 if ((in_flags & MSG_PEEK) == 0) 5271 so->so_error = 0; 5272 goto out; 5273 } else { 5274 if (so->so_rcv.sb_cc == 0) { 5275 /* indicate EOF */ 5276 error = 0; 5277 goto out; 5278 } 5279 } 5280 } 5281 if (so->so_rcv.sb_cc <= held_length) { 5282 if (so->so_error) { 5283 error = so->so_error; 5284 if ((in_flags & MSG_PEEK) == 0) { 5285 so->so_error = 0; 5286 } 5287 goto out; 5288 } 5289 if ((so->so_rcv.sb_cc == 0) && 5290 ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || 5291 (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { 5292 if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0) { 5293 /* 5294 * For active open side clear flags for 5295 * re-use passive open is blocked by 5296 * connect. 5297 */ 5298 if (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED) { 5299 /* 5300 * You were aborted, passive side 5301 * always hits here 5302 */ 5303 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); 5304 error = ECONNRESET; 5305 } 5306 so->so_state &= ~(SS_ISCONNECTING | 5307 SS_ISDISCONNECTING | 5308 SS_ISCONFIRMING | 5309 SS_ISCONNECTED); 5310 if (error == 0) { 5311 if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) == 0) { 5312 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN); 5313 error = ENOTCONN; 5314 } 5315 } 5316 goto out; 5317 } 5318 } 5319 if (block_allowed) { 5320 error = sbwait(&so->so_rcv); 5321 if (error) { 5322 goto out; 5323 } 5324 held_length = 0; 5325 goto restart_nosblocks; 5326 } else { 5327 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EWOULDBLOCK); 5328 error = EWOULDBLOCK; 5329 goto out; 5330 } 5331 } 5332 if (hold_sblock == 1) { 5333 SOCKBUF_UNLOCK(&so->so_rcv); 5334 hold_sblock = 0; 5335 } 5336 /* we possibly have data we can read */ 5337 /* sa_ignore FREED_MEMORY */ 5338 control = TAILQ_FIRST(&inp->read_queue); 5339 if (control == NULL) { 5340 /* 5341 * This could be happening since the appender did the 5342 * increment but as not yet did the tailq insert onto the 5343 * read_queue 5344 */ 5345 if (hold_rlock == 0) { 5346 SCTP_INP_READ_LOCK(inp); 5347 } 5348 control = TAILQ_FIRST(&inp->read_queue); 5349 if ((control == NULL) && (so->so_rcv.sb_cc != 0)) { 5350 #ifdef INVARIANTS 5351 panic("Huh, its non zero and nothing on control?"); 5352 #endif 5353 so->so_rcv.sb_cc = 0; 5354 } 5355 SCTP_INP_READ_UNLOCK(inp); 5356 hold_rlock = 0; 5357 goto restart; 5358 } 5359 if ((control->length == 0) && 5360 (control->do_not_ref_stcb)) { 5361 /* 5362 * Clean up code for freeing assoc that left behind a 5363 * pdapi.. maybe a peer in EEOR that just closed after 5364 * sending and never indicated a EOR. 5365 */ 5366 if (hold_rlock == 0) { 5367 hold_rlock = 1; 5368 SCTP_INP_READ_LOCK(inp); 5369 } 5370 control->held_length = 0; 5371 if (control->data) { 5372 /* Hmm there is data here .. fix */ 5373 struct mbuf *m_tmp; 5374 int cnt = 0; 5375 5376 m_tmp = control->data; 5377 while (m_tmp) { 5378 cnt += SCTP_BUF_LEN(m_tmp); 5379 if (SCTP_BUF_NEXT(m_tmp) == NULL) { 5380 control->tail_mbuf = m_tmp; 5381 control->end_added = 1; 5382 } 5383 m_tmp = SCTP_BUF_NEXT(m_tmp); 5384 } 5385 control->length = cnt; 5386 } else { 5387 /* remove it */ 5388 TAILQ_REMOVE(&inp->read_queue, control, next); 5389 /* Add back any hiddend data */ 5390 sctp_free_remote_addr(control->whoFrom); 5391 sctp_free_a_readq(stcb, control); 5392 } 5393 if (hold_rlock) { 5394 hold_rlock = 0; 5395 SCTP_INP_READ_UNLOCK(inp); 5396 } 5397 goto restart; 5398 } 5399 if ((control->length == 0) && 5400 (control->end_added == 1)) { 5401 /* 5402 * Do we also need to check for (control->pdapi_aborted == 5403 * 1)? 5404 */ 5405 if (hold_rlock == 0) { 5406 hold_rlock = 1; 5407 SCTP_INP_READ_LOCK(inp); 5408 } 5409 TAILQ_REMOVE(&inp->read_queue, control, next); 5410 if (control->data) { 5411 #ifdef INVARIANTS 5412 panic("control->data not null but control->length == 0"); 5413 #else 5414 SCTP_PRINTF("Strange, data left in the control buffer. Cleaning up.\n"); 5415 sctp_m_freem(control->data); 5416 control->data = NULL; 5417 #endif 5418 } 5419 if (control->aux_data) { 5420 sctp_m_free(control->aux_data); 5421 control->aux_data = NULL; 5422 } 5423 #ifdef INVARIANTS 5424 if (control->on_strm_q) { 5425 panic("About to free ctl:%p so:%p and its in %d", 5426 control, so, control->on_strm_q); 5427 } 5428 #endif 5429 sctp_free_remote_addr(control->whoFrom); 5430 sctp_free_a_readq(stcb, control); 5431 if (hold_rlock) { 5432 hold_rlock = 0; 5433 SCTP_INP_READ_UNLOCK(inp); 5434 } 5435 goto restart; 5436 } 5437 if (control->length == 0) { 5438 if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE)) && 5439 (filling_sinfo)) { 5440 /* find a more suitable one then this */ 5441 ctl = TAILQ_NEXT(control, next); 5442 while (ctl) { 5443 if ((ctl->stcb != control->stcb) && (ctl->length) && 5444 (ctl->some_taken || 5445 (ctl->spec_flags & M_NOTIFICATION) || 5446 ((ctl->do_not_ref_stcb == 0) && 5447 (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0))) 5448 ) { 5449 /*- 5450 * If we have a different TCB next, and there is data 5451 * present. If we have already taken some (pdapi), OR we can 5452 * ref the tcb and no delivery as started on this stream, we 5453 * take it. Note we allow a notification on a different 5454 * assoc to be delivered.. 5455 */ 5456 control = ctl; 5457 goto found_one; 5458 } else if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_INTERLEAVE_STRMS)) && 5459 (ctl->length) && 5460 ((ctl->some_taken) || 5461 ((ctl->do_not_ref_stcb == 0) && 5462 ((ctl->spec_flags & M_NOTIFICATION) == 0) && 5463 (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0)))) { 5464 /*- 5465 * If we have the same tcb, and there is data present, and we 5466 * have the strm interleave feature present. Then if we have 5467 * taken some (pdapi) or we can refer to tht tcb AND we have 5468 * not started a delivery for this stream, we can take it. 5469 * Note we do NOT allow a notificaiton on the same assoc to 5470 * be delivered. 5471 */ 5472 control = ctl; 5473 goto found_one; 5474 } 5475 ctl = TAILQ_NEXT(ctl, next); 5476 } 5477 } 5478 /* 5479 * if we reach here, not suitable replacement is available 5480 * <or> fragment interleave is NOT on. So stuff the sb_cc 5481 * into the our held count, and its time to sleep again. 5482 */ 5483 held_length = so->so_rcv.sb_cc; 5484 control->held_length = so->so_rcv.sb_cc; 5485 goto restart; 5486 } 5487 /* Clear the held length since there is something to read */ 5488 control->held_length = 0; 5489 found_one: 5490 /* 5491 * If we reach here, control has a some data for us to read off. 5492 * Note that stcb COULD be NULL. 5493 */ 5494 if (hold_rlock == 0) { 5495 hold_rlock = 1; 5496 SCTP_INP_READ_LOCK(inp); 5497 } 5498 control->some_taken++; 5499 stcb = control->stcb; 5500 if (stcb) { 5501 if ((control->do_not_ref_stcb == 0) && 5502 (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED)) { 5503 if (freecnt_applied == 0) 5504 stcb = NULL; 5505 } else if (control->do_not_ref_stcb == 0) { 5506 /* you can't free it on me please */ 5507 /* 5508 * The lock on the socket buffer protects us so the 5509 * free code will stop. But since we used the 5510 * socketbuf lock and the sender uses the tcb_lock 5511 * to increment, we need to use the atomic add to 5512 * the refcnt 5513 */ 5514 if (freecnt_applied) { 5515 #ifdef INVARIANTS 5516 panic("refcnt already incremented"); 5517 #else 5518 SCTP_PRINTF("refcnt already incremented?\n"); 5519 #endif 5520 } else { 5521 atomic_add_int(&stcb->asoc.refcnt, 1); 5522 freecnt_applied = 1; 5523 } 5524 /* 5525 * Setup to remember how much we have not yet told 5526 * the peer our rwnd has opened up. Note we grab the 5527 * value from the tcb from last time. Note too that 5528 * sack sending clears this when a sack is sent, 5529 * which is fine. Once we hit the rwnd_req, we then 5530 * will go to the sctp_user_rcvd() that will not 5531 * lock until it KNOWs it MUST send a WUP-SACK. 5532 */ 5533 freed_so_far = stcb->freed_by_sorcv_sincelast; 5534 stcb->freed_by_sorcv_sincelast = 0; 5535 } 5536 } 5537 if (stcb && 5538 ((control->spec_flags & M_NOTIFICATION) == 0) && 5539 control->do_not_ref_stcb == 0) { 5540 stcb->asoc.strmin[control->sinfo_stream].delivery_started = 1; 5541 } 5542 /* First lets get off the sinfo and sockaddr info */ 5543 if ((sinfo != NULL) && (filling_sinfo != 0)) { 5544 sinfo->sinfo_stream = control->sinfo_stream; 5545 sinfo->sinfo_ssn = (uint16_t)control->mid; 5546 sinfo->sinfo_flags = control->sinfo_flags; 5547 sinfo->sinfo_ppid = control->sinfo_ppid; 5548 sinfo->sinfo_context = control->sinfo_context; 5549 sinfo->sinfo_timetolive = control->sinfo_timetolive; 5550 sinfo->sinfo_tsn = control->sinfo_tsn; 5551 sinfo->sinfo_cumtsn = control->sinfo_cumtsn; 5552 sinfo->sinfo_assoc_id = control->sinfo_assoc_id; 5553 nxt = TAILQ_NEXT(control, next); 5554 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) || 5555 sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) { 5556 struct sctp_extrcvinfo *s_extra; 5557 5558 s_extra = (struct sctp_extrcvinfo *)sinfo; 5559 if ((nxt) && 5560 (nxt->length)) { 5561 s_extra->serinfo_next_flags = SCTP_NEXT_MSG_AVAIL; 5562 if (nxt->sinfo_flags & SCTP_UNORDERED) { 5563 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_UNORDERED; 5564 } 5565 if (nxt->spec_flags & M_NOTIFICATION) { 5566 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_NOTIFICATION; 5567 } 5568 s_extra->serinfo_next_aid = nxt->sinfo_assoc_id; 5569 s_extra->serinfo_next_length = nxt->length; 5570 s_extra->serinfo_next_ppid = nxt->sinfo_ppid; 5571 s_extra->serinfo_next_stream = nxt->sinfo_stream; 5572 if (nxt->tail_mbuf != NULL) { 5573 if (nxt->end_added) { 5574 s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_ISCOMPLETE; 5575 } 5576 } 5577 } else { 5578 /* 5579 * we explicitly 0 this, since the memcpy 5580 * got some other things beyond the older 5581 * sinfo_ that is on the control's structure 5582 * :-D 5583 */ 5584 nxt = NULL; 5585 s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG; 5586 s_extra->serinfo_next_aid = 0; 5587 s_extra->serinfo_next_length = 0; 5588 s_extra->serinfo_next_ppid = 0; 5589 s_extra->serinfo_next_stream = 0; 5590 } 5591 } 5592 /* 5593 * update off the real current cum-ack, if we have an stcb. 5594 */ 5595 if ((control->do_not_ref_stcb == 0) && stcb) 5596 sinfo->sinfo_cumtsn = stcb->asoc.cumulative_tsn; 5597 /* 5598 * mask off the high bits, we keep the actual chunk bits in 5599 * there. 5600 */ 5601 sinfo->sinfo_flags &= 0x00ff; 5602 if ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) { 5603 sinfo->sinfo_flags |= SCTP_UNORDERED; 5604 } 5605 } 5606 #ifdef SCTP_ASOCLOG_OF_TSNS 5607 { 5608 int index, newindex; 5609 struct sctp_pcbtsn_rlog *entry; 5610 5611 do { 5612 index = inp->readlog_index; 5613 newindex = index + 1; 5614 if (newindex >= SCTP_READ_LOG_SIZE) { 5615 newindex = 0; 5616 } 5617 } while (atomic_cmpset_int(&inp->readlog_index, index, newindex) == 0); 5618 entry = &inp->readlog[index]; 5619 entry->vtag = control->sinfo_assoc_id; 5620 entry->strm = control->sinfo_stream; 5621 entry->seq = (uint16_t)control->mid; 5622 entry->sz = control->length; 5623 entry->flgs = control->sinfo_flags; 5624 } 5625 #endif 5626 if ((fromlen > 0) && (from != NULL)) { 5627 union sctp_sockstore store; 5628 size_t len; 5629 5630 switch (control->whoFrom->ro._l_addr.sa.sa_family) { 5631 #ifdef INET6 5632 case AF_INET6: 5633 len = sizeof(struct sockaddr_in6); 5634 store.sin6 = control->whoFrom->ro._l_addr.sin6; 5635 store.sin6.sin6_port = control->port_from; 5636 break; 5637 #endif 5638 #ifdef INET 5639 case AF_INET: 5640 #ifdef INET6 5641 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) { 5642 len = sizeof(struct sockaddr_in6); 5643 in6_sin_2_v4mapsin6(&control->whoFrom->ro._l_addr.sin, 5644 &store.sin6); 5645 store.sin6.sin6_port = control->port_from; 5646 } else { 5647 len = sizeof(struct sockaddr_in); 5648 store.sin = control->whoFrom->ro._l_addr.sin; 5649 store.sin.sin_port = control->port_from; 5650 } 5651 #else 5652 len = sizeof(struct sockaddr_in); 5653 store.sin = control->whoFrom->ro._l_addr.sin; 5654 store.sin.sin_port = control->port_from; 5655 #endif 5656 break; 5657 #endif 5658 default: 5659 len = 0; 5660 break; 5661 } 5662 memcpy(from, &store, min((size_t)fromlen, len)); 5663 #ifdef INET6 5664 { 5665 struct sockaddr_in6 lsa6, *from6; 5666 5667 from6 = (struct sockaddr_in6 *)from; 5668 sctp_recover_scope_mac(from6, (&lsa6)); 5669 } 5670 #endif 5671 } 5672 if (hold_rlock) { 5673 SCTP_INP_READ_UNLOCK(inp); 5674 hold_rlock = 0; 5675 } 5676 if (hold_sblock) { 5677 SOCKBUF_UNLOCK(&so->so_rcv); 5678 hold_sblock = 0; 5679 } 5680 /* now copy out what data we can */ 5681 if (mp == NULL) { 5682 /* copy out each mbuf in the chain up to length */ 5683 get_more_data: 5684 m = control->data; 5685 while (m) { 5686 /* Move out all we can */ 5687 cp_len = (int)uio->uio_resid; 5688 my_len = (int)SCTP_BUF_LEN(m); 5689 if (cp_len > my_len) { 5690 /* not enough in this buf */ 5691 cp_len = my_len; 5692 } 5693 if (hold_rlock) { 5694 SCTP_INP_READ_UNLOCK(inp); 5695 hold_rlock = 0; 5696 } 5697 if (cp_len > 0) 5698 error = uiomove(mtod(m, char *), cp_len, uio); 5699 /* re-read */ 5700 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { 5701 goto release; 5702 } 5703 if ((control->do_not_ref_stcb == 0) && stcb && 5704 stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { 5705 no_rcv_needed = 1; 5706 } 5707 if (error) { 5708 /* error we are out of here */ 5709 goto release; 5710 } 5711 SCTP_INP_READ_LOCK(inp); 5712 hold_rlock = 1; 5713 if (cp_len == SCTP_BUF_LEN(m)) { 5714 if ((SCTP_BUF_NEXT(m) == NULL) && 5715 (control->end_added)) { 5716 out_flags |= MSG_EOR; 5717 if ((control->do_not_ref_stcb == 0) && 5718 (control->stcb != NULL) && 5719 ((control->spec_flags & M_NOTIFICATION) == 0)) 5720 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5721 } 5722 if (control->spec_flags & M_NOTIFICATION) { 5723 out_flags |= MSG_NOTIFICATION; 5724 } 5725 /* we ate up the mbuf */ 5726 if (in_flags & MSG_PEEK) { 5727 /* just looking */ 5728 m = SCTP_BUF_NEXT(m); 5729 copied_so_far += cp_len; 5730 } else { 5731 /* dispose of the mbuf */ 5732 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5733 sctp_sblog(&so->so_rcv, 5734 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 5735 } 5736 sctp_sbfree(control, stcb, &so->so_rcv, m); 5737 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5738 sctp_sblog(&so->so_rcv, 5739 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 5740 } 5741 copied_so_far += cp_len; 5742 freed_so_far += cp_len; 5743 freed_so_far += MSIZE; 5744 atomic_subtract_int(&control->length, cp_len); 5745 control->data = sctp_m_free(m); 5746 m = control->data; 5747 /* 5748 * been through it all, must hold sb 5749 * lock ok to null tail 5750 */ 5751 if (control->data == NULL) { 5752 #ifdef INVARIANTS 5753 if ((control->end_added == 0) || 5754 (TAILQ_NEXT(control, next) == NULL)) { 5755 /* 5756 * If the end is not 5757 * added, OR the 5758 * next is NOT null 5759 * we MUST have the 5760 * lock. 5761 */ 5762 if (mtx_owned(&inp->inp_rdata_mtx) == 0) { 5763 panic("Hmm we don't own the lock?"); 5764 } 5765 } 5766 #endif 5767 control->tail_mbuf = NULL; 5768 #ifdef INVARIANTS 5769 if ((control->end_added) && ((out_flags & MSG_EOR) == 0)) { 5770 panic("end_added, nothing left and no MSG_EOR"); 5771 } 5772 #endif 5773 } 5774 } 5775 } else { 5776 /* Do we need to trim the mbuf? */ 5777 if (control->spec_flags & M_NOTIFICATION) { 5778 out_flags |= MSG_NOTIFICATION; 5779 } 5780 if ((in_flags & MSG_PEEK) == 0) { 5781 SCTP_BUF_RESV_UF(m, cp_len); 5782 SCTP_BUF_LEN(m) -= cp_len; 5783 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5784 sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, cp_len); 5785 } 5786 atomic_subtract_int(&so->so_rcv.sb_cc, cp_len); 5787 if ((control->do_not_ref_stcb == 0) && 5788 stcb) { 5789 atomic_subtract_int(&stcb->asoc.sb_cc, cp_len); 5790 } 5791 copied_so_far += cp_len; 5792 freed_so_far += cp_len; 5793 freed_so_far += MSIZE; 5794 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 5795 sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, 5796 SCTP_LOG_SBRESULT, 0); 5797 } 5798 atomic_subtract_int(&control->length, cp_len); 5799 } else { 5800 copied_so_far += cp_len; 5801 } 5802 } 5803 if ((out_flags & MSG_EOR) || (uio->uio_resid == 0)) { 5804 break; 5805 } 5806 if (((stcb) && (in_flags & MSG_PEEK) == 0) && 5807 (control->do_not_ref_stcb == 0) && 5808 (freed_so_far >= rwnd_req)) { 5809 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5810 } 5811 } /* end while(m) */ 5812 /* 5813 * At this point we have looked at it all and we either have 5814 * a MSG_EOR/or read all the user wants... <OR> 5815 * control->length == 0. 5816 */ 5817 if ((out_flags & MSG_EOR) && ((in_flags & MSG_PEEK) == 0)) { 5818 /* we are done with this control */ 5819 if (control->length == 0) { 5820 if (control->data) { 5821 #ifdef INVARIANTS 5822 panic("control->data not null at read eor?"); 5823 #else 5824 SCTP_PRINTF("Strange, data left in the control buffer .. invarients would panic?\n"); 5825 sctp_m_freem(control->data); 5826 control->data = NULL; 5827 #endif 5828 } 5829 done_with_control: 5830 if (hold_rlock == 0) { 5831 SCTP_INP_READ_LOCK(inp); 5832 hold_rlock = 1; 5833 } 5834 TAILQ_REMOVE(&inp->read_queue, control, next); 5835 /* Add back any hiddend data */ 5836 if (control->held_length) { 5837 held_length = 0; 5838 control->held_length = 0; 5839 wakeup_read_socket = 1; 5840 } 5841 if (control->aux_data) { 5842 sctp_m_free(control->aux_data); 5843 control->aux_data = NULL; 5844 } 5845 no_rcv_needed = control->do_not_ref_stcb; 5846 sctp_free_remote_addr(control->whoFrom); 5847 control->data = NULL; 5848 #ifdef INVARIANTS 5849 if (control->on_strm_q) { 5850 panic("About to free ctl:%p so:%p and its in %d", 5851 control, so, control->on_strm_q); 5852 } 5853 #endif 5854 sctp_free_a_readq(stcb, control); 5855 control = NULL; 5856 if ((freed_so_far >= rwnd_req) && 5857 (no_rcv_needed == 0)) 5858 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5859 5860 } else { 5861 /* 5862 * The user did not read all of this 5863 * message, turn off the returned MSG_EOR 5864 * since we are leaving more behind on the 5865 * control to read. 5866 */ 5867 #ifdef INVARIANTS 5868 if (control->end_added && 5869 (control->data == NULL) && 5870 (control->tail_mbuf == NULL)) { 5871 panic("Gak, control->length is corrupt?"); 5872 } 5873 #endif 5874 no_rcv_needed = control->do_not_ref_stcb; 5875 out_flags &= ~MSG_EOR; 5876 } 5877 } 5878 if (out_flags & MSG_EOR) { 5879 goto release; 5880 } 5881 if ((uio->uio_resid == 0) || 5882 ((in_eeor_mode) && 5883 (copied_so_far >= (uint32_t)max(so->so_rcv.sb_lowat, 1)))) { 5884 goto release; 5885 } 5886 /* 5887 * If I hit here the receiver wants more and this message is 5888 * NOT done (pd-api). So two questions. Can we block? if not 5889 * we are done. Did the user NOT set MSG_WAITALL? 5890 */ 5891 if (block_allowed == 0) { 5892 goto release; 5893 } 5894 /* 5895 * We need to wait for more data a few things: - We don't 5896 * sbunlock() so we don't get someone else reading. - We 5897 * must be sure to account for the case where what is added 5898 * is NOT to our control when we wakeup. 5899 */ 5900 5901 /* 5902 * Do we need to tell the transport a rwnd update might be 5903 * needed before we go to sleep? 5904 */ 5905 if (((stcb) && (in_flags & MSG_PEEK) == 0) && 5906 ((freed_so_far >= rwnd_req) && 5907 (control->do_not_ref_stcb == 0) && 5908 (no_rcv_needed == 0))) { 5909 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 5910 } 5911 wait_some_more: 5912 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) { 5913 goto release; 5914 } 5915 if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) 5916 goto release; 5917 5918 if (hold_rlock == 1) { 5919 SCTP_INP_READ_UNLOCK(inp); 5920 hold_rlock = 0; 5921 } 5922 if (hold_sblock == 0) { 5923 SOCKBUF_LOCK(&so->so_rcv); 5924 hold_sblock = 1; 5925 } 5926 if ((copied_so_far) && (control->length == 0) && 5927 (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE))) { 5928 goto release; 5929 } 5930 if (so->so_rcv.sb_cc <= control->held_length) { 5931 error = sbwait(&so->so_rcv); 5932 if (error) { 5933 goto release; 5934 } 5935 control->held_length = 0; 5936 } 5937 if (hold_sblock) { 5938 SOCKBUF_UNLOCK(&so->so_rcv); 5939 hold_sblock = 0; 5940 } 5941 if (control->length == 0) { 5942 /* still nothing here */ 5943 if (control->end_added == 1) { 5944 /* he aborted, or is done i.e.did a shutdown */ 5945 out_flags |= MSG_EOR; 5946 if (control->pdapi_aborted) { 5947 if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0)) 5948 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5949 5950 out_flags |= MSG_TRUNC; 5951 } else { 5952 if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0)) 5953 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 5954 } 5955 goto done_with_control; 5956 } 5957 if (so->so_rcv.sb_cc > held_length) { 5958 control->held_length = so->so_rcv.sb_cc; 5959 held_length = 0; 5960 } 5961 goto wait_some_more; 5962 } else if (control->data == NULL) { 5963 /* 5964 * we must re-sync since data is probably being 5965 * added 5966 */ 5967 SCTP_INP_READ_LOCK(inp); 5968 if ((control->length > 0) && (control->data == NULL)) { 5969 /* 5970 * big trouble.. we have the lock and its 5971 * corrupt? 5972 */ 5973 #ifdef INVARIANTS 5974 panic("Impossible data==NULL length !=0"); 5975 #endif 5976 out_flags |= MSG_EOR; 5977 out_flags |= MSG_TRUNC; 5978 control->length = 0; 5979 SCTP_INP_READ_UNLOCK(inp); 5980 goto done_with_control; 5981 } 5982 SCTP_INP_READ_UNLOCK(inp); 5983 /* We will fall around to get more data */ 5984 } 5985 goto get_more_data; 5986 } else { 5987 /*- 5988 * Give caller back the mbuf chain, 5989 * store in uio_resid the length 5990 */ 5991 wakeup_read_socket = 0; 5992 if ((control->end_added == 0) || 5993 (TAILQ_NEXT(control, next) == NULL)) { 5994 /* Need to get rlock */ 5995 if (hold_rlock == 0) { 5996 SCTP_INP_READ_LOCK(inp); 5997 hold_rlock = 1; 5998 } 5999 } 6000 if (control->end_added) { 6001 out_flags |= MSG_EOR; 6002 if ((control->do_not_ref_stcb == 0) && 6003 (control->stcb != NULL) && 6004 ((control->spec_flags & M_NOTIFICATION) == 0)) 6005 control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; 6006 } 6007 if (control->spec_flags & M_NOTIFICATION) { 6008 out_flags |= MSG_NOTIFICATION; 6009 } 6010 uio->uio_resid = control->length; 6011 *mp = control->data; 6012 m = control->data; 6013 while (m) { 6014 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 6015 sctp_sblog(&so->so_rcv, 6016 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m)); 6017 } 6018 sctp_sbfree(control, stcb, &so->so_rcv, m); 6019 freed_so_far += SCTP_BUF_LEN(m); 6020 freed_so_far += MSIZE; 6021 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { 6022 sctp_sblog(&so->so_rcv, 6023 control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0); 6024 } 6025 m = SCTP_BUF_NEXT(m); 6026 } 6027 control->data = control->tail_mbuf = NULL; 6028 control->length = 0; 6029 if (out_flags & MSG_EOR) { 6030 /* Done with this control */ 6031 goto done_with_control; 6032 } 6033 } 6034 release: 6035 if (hold_rlock == 1) { 6036 SCTP_INP_READ_UNLOCK(inp); 6037 hold_rlock = 0; 6038 } 6039 if (hold_sblock == 1) { 6040 SOCKBUF_UNLOCK(&so->so_rcv); 6041 hold_sblock = 0; 6042 } 6043 sbunlock(&so->so_rcv); 6044 sockbuf_lock = 0; 6045 6046 release_unlocked: 6047 if (hold_sblock) { 6048 SOCKBUF_UNLOCK(&so->so_rcv); 6049 hold_sblock = 0; 6050 } 6051 if ((stcb) && (in_flags & MSG_PEEK) == 0) { 6052 if ((freed_so_far >= rwnd_req) && 6053 (control && (control->do_not_ref_stcb == 0)) && 6054 (no_rcv_needed == 0)) 6055 sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req); 6056 } 6057 out: 6058 if (msg_flags) { 6059 *msg_flags = out_flags; 6060 } 6061 if (((out_flags & MSG_EOR) == 0) && 6062 ((in_flags & MSG_PEEK) == 0) && 6063 (sinfo) && 6064 (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) || 6065 sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO))) { 6066 struct sctp_extrcvinfo *s_extra; 6067 6068 s_extra = (struct sctp_extrcvinfo *)sinfo; 6069 s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG; 6070 } 6071 if (hold_rlock == 1) { 6072 SCTP_INP_READ_UNLOCK(inp); 6073 } 6074 if (hold_sblock) { 6075 SOCKBUF_UNLOCK(&so->so_rcv); 6076 } 6077 if (sockbuf_lock) { 6078 sbunlock(&so->so_rcv); 6079 } 6080 if (freecnt_applied) { 6081 /* 6082 * The lock on the socket buffer protects us so the free 6083 * code will stop. But since we used the socketbuf lock and 6084 * the sender uses the tcb_lock to increment, we need to use 6085 * the atomic add to the refcnt. 6086 */ 6087 if (stcb == NULL) { 6088 #ifdef INVARIANTS 6089 panic("stcb for refcnt has gone NULL?"); 6090 goto stage_left; 6091 #else 6092 goto stage_left; 6093 #endif 6094 } 6095 /* Save the value back for next time */ 6096 stcb->freed_by_sorcv_sincelast = freed_so_far; 6097 atomic_add_int(&stcb->asoc.refcnt, -1); 6098 } 6099 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) { 6100 if (stcb) { 6101 sctp_misc_ints(SCTP_SORECV_DONE, 6102 freed_so_far, 6103 (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), 6104 stcb->asoc.my_rwnd, 6105 so->so_rcv.sb_cc); 6106 } else { 6107 sctp_misc_ints(SCTP_SORECV_DONE, 6108 freed_so_far, 6109 (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), 6110 0, 6111 so->so_rcv.sb_cc); 6112 } 6113 } 6114 stage_left: 6115 if (wakeup_read_socket) { 6116 sctp_sorwakeup(inp, so); 6117 } 6118 return (error); 6119 } 6120 6121 6122 #ifdef SCTP_MBUF_LOGGING 6123 struct mbuf * 6124 sctp_m_free(struct mbuf *m) 6125 { 6126 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { 6127 sctp_log_mb(m, SCTP_MBUF_IFREE); 6128 } 6129 return (m_free(m)); 6130 } 6131 6132 void 6133 sctp_m_freem(struct mbuf *mb) 6134 { 6135 while (mb != NULL) 6136 mb = sctp_m_free(mb); 6137 } 6138 6139 #endif 6140 6141 int 6142 sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id) 6143 { 6144 /* 6145 * Given a local address. For all associations that holds the 6146 * address, request a peer-set-primary. 6147 */ 6148 struct sctp_ifa *ifa; 6149 struct sctp_laddr *wi; 6150 6151 ifa = sctp_find_ifa_by_addr(sa, vrf_id, 0); 6152 if (ifa == NULL) { 6153 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EADDRNOTAVAIL); 6154 return (EADDRNOTAVAIL); 6155 } 6156 /* 6157 * Now that we have the ifa we must awaken the iterator with this 6158 * message. 6159 */ 6160 wi = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_laddr), struct sctp_laddr); 6161 if (wi == NULL) { 6162 SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); 6163 return (ENOMEM); 6164 } 6165 /* Now incr the count and int wi structure */ 6166 SCTP_INCR_LADDR_COUNT(); 6167 bzero(wi, sizeof(*wi)); 6168 (void)SCTP_GETTIME_TIMEVAL(&wi->start_time); 6169 wi->ifa = ifa; 6170 wi->action = SCTP_SET_PRIM_ADDR; 6171 atomic_add_int(&ifa->refcount, 1); 6172 6173 /* Now add it to the work queue */ 6174 SCTP_WQ_ADDR_LOCK(); 6175 /* 6176 * Should this really be a tailq? As it is we will process the 6177 * newest first :-0 6178 */ 6179 LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr); 6180 SCTP_WQ_ADDR_UNLOCK(); 6181 sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ, 6182 (struct sctp_inpcb *)NULL, 6183 (struct sctp_tcb *)NULL, 6184 (struct sctp_nets *)NULL); 6185 return (0); 6186 } 6187 6188 6189 int 6190 sctp_soreceive(struct socket *so, 6191 struct sockaddr **psa, 6192 struct uio *uio, 6193 struct mbuf **mp0, 6194 struct mbuf **controlp, 6195 int *flagsp) 6196 { 6197 int error, fromlen; 6198 uint8_t sockbuf[256]; 6199 struct sockaddr *from; 6200 struct sctp_extrcvinfo sinfo; 6201 int filling_sinfo = 1; 6202 struct sctp_inpcb *inp; 6203 6204 inp = (struct sctp_inpcb *)so->so_pcb; 6205 /* pickup the assoc we are reading from */ 6206 if (inp == NULL) { 6207 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6208 return (EINVAL); 6209 } 6210 if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT) && 6211 sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVRCVINFO) && 6212 sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) || 6213 (controlp == NULL)) { 6214 /* user does not want the sndrcv ctl */ 6215 filling_sinfo = 0; 6216 } 6217 if (psa) { 6218 from = (struct sockaddr *)sockbuf; 6219 fromlen = sizeof(sockbuf); 6220 from->sa_len = 0; 6221 } else { 6222 from = NULL; 6223 fromlen = 0; 6224 } 6225 6226 if (filling_sinfo) { 6227 memset(&sinfo, 0, sizeof(struct sctp_extrcvinfo)); 6228 } 6229 error = sctp_sorecvmsg(so, uio, mp0, from, fromlen, flagsp, 6230 (struct sctp_sndrcvinfo *)&sinfo, filling_sinfo); 6231 if (controlp != NULL) { 6232 /* copy back the sinfo in a CMSG format */ 6233 if (filling_sinfo) 6234 *controlp = sctp_build_ctl_nchunk(inp, 6235 (struct sctp_sndrcvinfo *)&sinfo); 6236 else 6237 *controlp = NULL; 6238 } 6239 if (psa) { 6240 /* copy back the address info */ 6241 if (from && from->sa_len) { 6242 *psa = sodupsockaddr(from, M_NOWAIT); 6243 } else { 6244 *psa = NULL; 6245 } 6246 } 6247 return (error); 6248 } 6249 6250 6251 6252 6253 6254 int 6255 sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, 6256 int totaddr, int *error) 6257 { 6258 int added = 0; 6259 int i; 6260 struct sctp_inpcb *inp; 6261 struct sockaddr *sa; 6262 size_t incr = 0; 6263 #ifdef INET 6264 struct sockaddr_in *sin; 6265 #endif 6266 #ifdef INET6 6267 struct sockaddr_in6 *sin6; 6268 #endif 6269 6270 sa = addr; 6271 inp = stcb->sctp_ep; 6272 *error = 0; 6273 for (i = 0; i < totaddr; i++) { 6274 switch (sa->sa_family) { 6275 #ifdef INET 6276 case AF_INET: 6277 incr = sizeof(struct sockaddr_in); 6278 sin = (struct sockaddr_in *)sa; 6279 if ((sin->sin_addr.s_addr == INADDR_ANY) || 6280 (sin->sin_addr.s_addr == INADDR_BROADCAST) || 6281 IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { 6282 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6283 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6284 SCTP_FROM_SCTPUTIL + SCTP_LOC_7); 6285 *error = EINVAL; 6286 goto out_now; 6287 } 6288 if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port, 6289 SCTP_DONOT_SETSCOPE, 6290 SCTP_ADDR_IS_CONFIRMED)) { 6291 /* assoc gone no un-lock */ 6292 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); 6293 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6294 SCTP_FROM_SCTPUTIL + SCTP_LOC_8); 6295 *error = ENOBUFS; 6296 goto out_now; 6297 } 6298 added++; 6299 break; 6300 #endif 6301 #ifdef INET6 6302 case AF_INET6: 6303 incr = sizeof(struct sockaddr_in6); 6304 sin6 = (struct sockaddr_in6 *)sa; 6305 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) || 6306 IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { 6307 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6308 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6309 SCTP_FROM_SCTPUTIL + SCTP_LOC_9); 6310 *error = EINVAL; 6311 goto out_now; 6312 } 6313 if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port, 6314 SCTP_DONOT_SETSCOPE, 6315 SCTP_ADDR_IS_CONFIRMED)) { 6316 /* assoc gone no un-lock */ 6317 SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); 6318 (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, 6319 SCTP_FROM_SCTPUTIL + SCTP_LOC_10); 6320 *error = ENOBUFS; 6321 goto out_now; 6322 } 6323 added++; 6324 break; 6325 #endif 6326 default: 6327 break; 6328 } 6329 sa = (struct sockaddr *)((caddr_t)sa + incr); 6330 } 6331 out_now: 6332 return (added); 6333 } 6334 6335 struct sctp_tcb * 6336 sctp_connectx_helper_find(struct sctp_inpcb *inp, struct sockaddr *addr, 6337 unsigned int *totaddr, 6338 unsigned int *num_v4, unsigned int *num_v6, int *error, 6339 unsigned int limit, int *bad_addr) 6340 { 6341 struct sockaddr *sa; 6342 struct sctp_tcb *stcb = NULL; 6343 unsigned int incr, at, i; 6344 6345 at = 0; 6346 sa = addr; 6347 *error = *num_v6 = *num_v4 = 0; 6348 /* account and validate addresses */ 6349 for (i = 0; i < *totaddr; i++) { 6350 switch (sa->sa_family) { 6351 #ifdef INET 6352 case AF_INET: 6353 incr = (unsigned int)sizeof(struct sockaddr_in); 6354 if (sa->sa_len != incr) { 6355 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6356 *error = EINVAL; 6357 *bad_addr = 1; 6358 return (NULL); 6359 } 6360 (*num_v4) += 1; 6361 break; 6362 #endif 6363 #ifdef INET6 6364 case AF_INET6: 6365 { 6366 struct sockaddr_in6 *sin6; 6367 6368 sin6 = (struct sockaddr_in6 *)sa; 6369 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6370 /* Must be non-mapped for connectx */ 6371 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6372 *error = EINVAL; 6373 *bad_addr = 1; 6374 return (NULL); 6375 } 6376 incr = (unsigned int)sizeof(struct sockaddr_in6); 6377 if (sa->sa_len != incr) { 6378 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6379 *error = EINVAL; 6380 *bad_addr = 1; 6381 return (NULL); 6382 } 6383 (*num_v6) += 1; 6384 break; 6385 } 6386 #endif 6387 default: 6388 *totaddr = i; 6389 incr = 0; 6390 /* we are done */ 6391 break; 6392 } 6393 if (i == *totaddr) { 6394 break; 6395 } 6396 SCTP_INP_INCR_REF(inp); 6397 stcb = sctp_findassociation_ep_addr(&inp, sa, NULL, NULL, NULL); 6398 if (stcb != NULL) { 6399 /* Already have or am bring up an association */ 6400 return (stcb); 6401 } else { 6402 SCTP_INP_DECR_REF(inp); 6403 } 6404 if ((at + incr) > limit) { 6405 *totaddr = i; 6406 break; 6407 } 6408 sa = (struct sockaddr *)((caddr_t)sa + incr); 6409 } 6410 return ((struct sctp_tcb *)NULL); 6411 } 6412 6413 /* 6414 * sctp_bindx(ADD) for one address. 6415 * assumes all arguments are valid/checked by caller. 6416 */ 6417 void 6418 sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, 6419 struct sockaddr *sa, sctp_assoc_t assoc_id, 6420 uint32_t vrf_id, int *error, void *p) 6421 { 6422 struct sockaddr *addr_touse; 6423 #if defined(INET) && defined(INET6) 6424 struct sockaddr_in sin; 6425 #endif 6426 6427 /* see if we're bound all already! */ 6428 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6429 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6430 *error = EINVAL; 6431 return; 6432 } 6433 addr_touse = sa; 6434 #ifdef INET6 6435 if (sa->sa_family == AF_INET6) { 6436 #ifdef INET 6437 struct sockaddr_in6 *sin6; 6438 6439 #endif 6440 if (sa->sa_len != sizeof(struct sockaddr_in6)) { 6441 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6442 *error = EINVAL; 6443 return; 6444 } 6445 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { 6446 /* can only bind v6 on PF_INET6 sockets */ 6447 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6448 *error = EINVAL; 6449 return; 6450 } 6451 #ifdef INET 6452 sin6 = (struct sockaddr_in6 *)addr_touse; 6453 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6454 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6455 SCTP_IPV6_V6ONLY(inp)) { 6456 /* can't bind v4-mapped on PF_INET sockets */ 6457 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6458 *error = EINVAL; 6459 return; 6460 } 6461 in6_sin6_2_sin(&sin, sin6); 6462 addr_touse = (struct sockaddr *)&sin; 6463 } 6464 #endif 6465 } 6466 #endif 6467 #ifdef INET 6468 if (sa->sa_family == AF_INET) { 6469 if (sa->sa_len != sizeof(struct sockaddr_in)) { 6470 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6471 *error = EINVAL; 6472 return; 6473 } 6474 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6475 SCTP_IPV6_V6ONLY(inp)) { 6476 /* can't bind v4 on PF_INET sockets */ 6477 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6478 *error = EINVAL; 6479 return; 6480 } 6481 } 6482 #endif 6483 if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { 6484 if (p == NULL) { 6485 /* Can't get proc for Net/Open BSD */ 6486 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6487 *error = EINVAL; 6488 return; 6489 } 6490 *error = sctp_inpcb_bind(so, addr_touse, NULL, p); 6491 return; 6492 } 6493 /* 6494 * No locks required here since bind and mgmt_ep_sa all do their own 6495 * locking. If we do something for the FIX: below we may need to 6496 * lock in that case. 6497 */ 6498 if (assoc_id == 0) { 6499 /* add the address */ 6500 struct sctp_inpcb *lep; 6501 struct sockaddr_in *lsin = (struct sockaddr_in *)addr_touse; 6502 6503 /* validate the incoming port */ 6504 if ((lsin->sin_port != 0) && 6505 (lsin->sin_port != inp->sctp_lport)) { 6506 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6507 *error = EINVAL; 6508 return; 6509 } else { 6510 /* user specified 0 port, set it to existing port */ 6511 lsin->sin_port = inp->sctp_lport; 6512 } 6513 6514 lep = sctp_pcb_findep(addr_touse, 1, 0, vrf_id); 6515 if (lep != NULL) { 6516 /* 6517 * We must decrement the refcount since we have the 6518 * ep already and are binding. No remove going on 6519 * here. 6520 */ 6521 SCTP_INP_DECR_REF(lep); 6522 } 6523 if (lep == inp) { 6524 /* already bound to it.. ok */ 6525 return; 6526 } else if (lep == NULL) { 6527 ((struct sockaddr_in *)addr_touse)->sin_port = 0; 6528 *error = sctp_addr_mgmt_ep_sa(inp, addr_touse, 6529 SCTP_ADD_IP_ADDRESS, 6530 vrf_id, NULL); 6531 } else { 6532 *error = EADDRINUSE; 6533 } 6534 if (*error) 6535 return; 6536 } else { 6537 /* 6538 * FIX: decide whether we allow assoc based bindx 6539 */ 6540 } 6541 } 6542 6543 /* 6544 * sctp_bindx(DELETE) for one address. 6545 * assumes all arguments are valid/checked by caller. 6546 */ 6547 void 6548 sctp_bindx_delete_address(struct sctp_inpcb *inp, 6549 struct sockaddr *sa, sctp_assoc_t assoc_id, 6550 uint32_t vrf_id, int *error) 6551 { 6552 struct sockaddr *addr_touse; 6553 #if defined(INET) && defined(INET6) 6554 struct sockaddr_in sin; 6555 #endif 6556 6557 /* see if we're bound all already! */ 6558 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6559 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6560 *error = EINVAL; 6561 return; 6562 } 6563 addr_touse = sa; 6564 #ifdef INET6 6565 if (sa->sa_family == AF_INET6) { 6566 #ifdef INET 6567 struct sockaddr_in6 *sin6; 6568 #endif 6569 6570 if (sa->sa_len != sizeof(struct sockaddr_in6)) { 6571 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6572 *error = EINVAL; 6573 return; 6574 } 6575 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { 6576 /* can only bind v6 on PF_INET6 sockets */ 6577 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6578 *error = EINVAL; 6579 return; 6580 } 6581 #ifdef INET 6582 sin6 = (struct sockaddr_in6 *)addr_touse; 6583 if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { 6584 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6585 SCTP_IPV6_V6ONLY(inp)) { 6586 /* can't bind mapped-v4 on PF_INET sockets */ 6587 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6588 *error = EINVAL; 6589 return; 6590 } 6591 in6_sin6_2_sin(&sin, sin6); 6592 addr_touse = (struct sockaddr *)&sin; 6593 } 6594 #endif 6595 } 6596 #endif 6597 #ifdef INET 6598 if (sa->sa_family == AF_INET) { 6599 if (sa->sa_len != sizeof(struct sockaddr_in)) { 6600 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6601 *error = EINVAL; 6602 return; 6603 } 6604 if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && 6605 SCTP_IPV6_V6ONLY(inp)) { 6606 /* can't bind v4 on PF_INET sockets */ 6607 SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); 6608 *error = EINVAL; 6609 return; 6610 } 6611 } 6612 #endif 6613 /* 6614 * No lock required mgmt_ep_sa does its own locking. If the FIX: 6615 * below is ever changed we may need to lock before calling 6616 * association level binding. 6617 */ 6618 if (assoc_id == 0) { 6619 /* delete the address */ 6620 *error = sctp_addr_mgmt_ep_sa(inp, addr_touse, 6621 SCTP_DEL_IP_ADDRESS, 6622 vrf_id, NULL); 6623 } else { 6624 /* 6625 * FIX: decide whether we allow assoc based bindx 6626 */ 6627 } 6628 } 6629 6630 /* 6631 * returns the valid local address count for an assoc, taking into account 6632 * all scoping rules 6633 */ 6634 int 6635 sctp_local_addr_count(struct sctp_tcb *stcb) 6636 { 6637 int loopback_scope; 6638 #if defined(INET) 6639 int ipv4_local_scope, ipv4_addr_legal; 6640 #endif 6641 #if defined (INET6) 6642 int local_scope, site_scope, ipv6_addr_legal; 6643 #endif 6644 struct sctp_vrf *vrf; 6645 struct sctp_ifn *sctp_ifn; 6646 struct sctp_ifa *sctp_ifa; 6647 int count = 0; 6648 6649 /* Turn on all the appropriate scopes */ 6650 loopback_scope = stcb->asoc.scope.loopback_scope; 6651 #if defined(INET) 6652 ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope; 6653 ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; 6654 #endif 6655 #if defined(INET6) 6656 local_scope = stcb->asoc.scope.local_scope; 6657 site_scope = stcb->asoc.scope.site_scope; 6658 ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal; 6659 #endif 6660 SCTP_IPI_ADDR_RLOCK(); 6661 vrf = sctp_find_vrf(stcb->asoc.vrf_id); 6662 if (vrf == NULL) { 6663 /* no vrf, no addresses */ 6664 SCTP_IPI_ADDR_RUNLOCK(); 6665 return (0); 6666 } 6667 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 6668 /* 6669 * bound all case: go through all ifns on the vrf 6670 */ 6671 LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 6672 if ((loopback_scope == 0) && 6673 SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { 6674 continue; 6675 } 6676 LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 6677 if (sctp_is_addr_restricted(stcb, sctp_ifa)) 6678 continue; 6679 switch (sctp_ifa->address.sa.sa_family) { 6680 #ifdef INET 6681 case AF_INET: 6682 if (ipv4_addr_legal) { 6683 struct sockaddr_in *sin; 6684 6685 sin = &sctp_ifa->address.sin; 6686 if (sin->sin_addr.s_addr == 0) { 6687 /* 6688 * skip unspecified 6689 * addrs 6690 */ 6691 continue; 6692 } 6693 if (prison_check_ip4(stcb->sctp_ep->ip_inp.inp.inp_cred, 6694 &sin->sin_addr) != 0) { 6695 continue; 6696 } 6697 if ((ipv4_local_scope == 0) && 6698 (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) { 6699 continue; 6700 } 6701 /* count this one */ 6702 count++; 6703 } else { 6704 continue; 6705 } 6706 break; 6707 #endif 6708 #ifdef INET6 6709 case AF_INET6: 6710 if (ipv6_addr_legal) { 6711 struct sockaddr_in6 *sin6; 6712 6713 sin6 = &sctp_ifa->address.sin6; 6714 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { 6715 continue; 6716 } 6717 if (prison_check_ip6(stcb->sctp_ep->ip_inp.inp.inp_cred, 6718 &sin6->sin6_addr) != 0) { 6719 continue; 6720 } 6721 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { 6722 if (local_scope == 0) 6723 continue; 6724 if (sin6->sin6_scope_id == 0) { 6725 if (sa6_recoverscope(sin6) != 0) 6726 /* 6727 * 6728 * bad 6729 * link 6730 * 6731 * local 6732 * 6733 * address 6734 */ 6735 continue; 6736 } 6737 } 6738 if ((site_scope == 0) && 6739 (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) { 6740 continue; 6741 } 6742 /* count this one */ 6743 count++; 6744 } 6745 break; 6746 #endif 6747 default: 6748 /* TSNH */ 6749 break; 6750 } 6751 } 6752 } 6753 } else { 6754 /* 6755 * subset bound case 6756 */ 6757 struct sctp_laddr *laddr; 6758 6759 LIST_FOREACH(laddr, &stcb->sctp_ep->sctp_addr_list, 6760 sctp_nxt_addr) { 6761 if (sctp_is_addr_restricted(stcb, laddr->ifa)) { 6762 continue; 6763 } 6764 /* count this one */ 6765 count++; 6766 } 6767 } 6768 SCTP_IPI_ADDR_RUNLOCK(); 6769 return (count); 6770 } 6771 6772 #if defined(SCTP_LOCAL_TRACE_BUF) 6773 6774 void 6775 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) 6776 { 6777 uint32_t saveindex, newindex; 6778 6779 do { 6780 saveindex = SCTP_BASE_SYSCTL(sctp_log).index; 6781 if (saveindex >= SCTP_MAX_LOGGING_SIZE) { 6782 newindex = 1; 6783 } else { 6784 newindex = saveindex + 1; 6785 } 6786 } while (atomic_cmpset_int(&SCTP_BASE_SYSCTL(sctp_log).index, saveindex, newindex) == 0); 6787 if (saveindex >= SCTP_MAX_LOGGING_SIZE) { 6788 saveindex = 0; 6789 } 6790 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].timestamp = SCTP_GET_CYCLECOUNT; 6791 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].subsys = subsys; 6792 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[0] = a; 6793 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[1] = b; 6794 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[2] = c; 6795 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[3] = d; 6796 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[4] = e; 6797 SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[5] = f; 6798 } 6799 6800 #endif 6801 static void 6802 sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *inp, 6803 const struct sockaddr *sa SCTP_UNUSED, void *ctx SCTP_UNUSED) 6804 { 6805 struct ip *iph; 6806 #ifdef INET6 6807 struct ip6_hdr *ip6; 6808 #endif 6809 struct mbuf *sp, *last; 6810 struct udphdr *uhdr; 6811 uint16_t port; 6812 6813 if ((m->m_flags & M_PKTHDR) == 0) { 6814 /* Can't handle one that is not a pkt hdr */ 6815 goto out; 6816 } 6817 /* Pull the src port */ 6818 iph = mtod(m, struct ip *); 6819 uhdr = (struct udphdr *)((caddr_t)iph + off); 6820 port = uhdr->uh_sport; 6821 /* 6822 * Split out the mbuf chain. Leave the IP header in m, place the 6823 * rest in the sp. 6824 */ 6825 sp = m_split(m, off, M_NOWAIT); 6826 if (sp == NULL) { 6827 /* Gak, drop packet, we can't do a split */ 6828 goto out; 6829 } 6830 if (sp->m_pkthdr.len < sizeof(struct udphdr) + sizeof(struct sctphdr)) { 6831 /* Gak, packet can't have an SCTP header in it - too small */ 6832 m_freem(sp); 6833 goto out; 6834 } 6835 /* Now pull up the UDP header and SCTP header together */ 6836 sp = m_pullup(sp, sizeof(struct udphdr) + sizeof(struct sctphdr)); 6837 if (sp == NULL) { 6838 /* Gak pullup failed */ 6839 goto out; 6840 } 6841 /* Trim out the UDP header */ 6842 m_adj(sp, sizeof(struct udphdr)); 6843 6844 /* Now reconstruct the mbuf chain */ 6845 for (last = m; last->m_next; last = last->m_next); 6846 last->m_next = sp; 6847 m->m_pkthdr.len += sp->m_pkthdr.len; 6848 /* 6849 * The CSUM_DATA_VALID flags indicates that the HW checked the UDP 6850 * checksum and it was valid. Since CSUM_DATA_VALID == 6851 * CSUM_SCTP_VALID this would imply that the HW also verified the 6852 * SCTP checksum. Therefore, clear the bit. 6853 */ 6854 SCTPDBG(SCTP_DEBUG_CRCOFFLOAD, 6855 "sctp_recv_udp_tunneled_packet(): Packet of length %d received on %s with csum_flags 0x%b.\n", 6856 m->m_pkthdr.len, 6857 if_name(m->m_pkthdr.rcvif), 6858 (int)m->m_pkthdr.csum_flags, CSUM_BITS); 6859 m->m_pkthdr.csum_flags &= ~CSUM_DATA_VALID; 6860 iph = mtod(m, struct ip *); 6861 switch (iph->ip_v) { 6862 #ifdef INET 6863 case IPVERSION: 6864 iph->ip_len = htons(ntohs(iph->ip_len) - sizeof(struct udphdr)); 6865 sctp_input_with_port(m, off, port); 6866 break; 6867 #endif 6868 #ifdef INET6 6869 case IPV6_VERSION >> 4: 6870 ip6 = mtod(m, struct ip6_hdr *); 6871 ip6->ip6_plen = htons(ntohs(ip6->ip6_plen) - sizeof(struct udphdr)); 6872 sctp6_input_with_port(&m, &off, port); 6873 break; 6874 #endif 6875 default: 6876 goto out; 6877 break; 6878 } 6879 return; 6880 out: 6881 m_freem(m); 6882 } 6883 6884 #ifdef INET 6885 static void 6886 sctp_recv_icmp_tunneled_packet(int cmd, struct sockaddr *sa, void *vip, void *ctx SCTP_UNUSED) 6887 { 6888 struct ip *outer_ip, *inner_ip; 6889 struct sctphdr *sh; 6890 struct icmp *icmp; 6891 struct udphdr *udp; 6892 struct sctp_inpcb *inp; 6893 struct sctp_tcb *stcb; 6894 struct sctp_nets *net; 6895 struct sctp_init_chunk *ch; 6896 struct sockaddr_in src, dst; 6897 uint8_t type, code; 6898 6899 inner_ip = (struct ip *)vip; 6900 icmp = (struct icmp *)((caddr_t)inner_ip - 6901 (sizeof(struct icmp) - sizeof(struct ip))); 6902 outer_ip = (struct ip *)((caddr_t)icmp - sizeof(struct ip)); 6903 if (ntohs(outer_ip->ip_len) < 6904 sizeof(struct ip) + 8 + (inner_ip->ip_hl << 2) + sizeof(struct udphdr) + 8) { 6905 return; 6906 } 6907 udp = (struct udphdr *)((caddr_t)inner_ip + (inner_ip->ip_hl << 2)); 6908 sh = (struct sctphdr *)(udp + 1); 6909 memset(&src, 0, sizeof(struct sockaddr_in)); 6910 src.sin_family = AF_INET; 6911 src.sin_len = sizeof(struct sockaddr_in); 6912 src.sin_port = sh->src_port; 6913 src.sin_addr = inner_ip->ip_src; 6914 memset(&dst, 0, sizeof(struct sockaddr_in)); 6915 dst.sin_family = AF_INET; 6916 dst.sin_len = sizeof(struct sockaddr_in); 6917 dst.sin_port = sh->dest_port; 6918 dst.sin_addr = inner_ip->ip_dst; 6919 /* 6920 * 'dst' holds the dest of the packet that failed to be sent. 'src' 6921 * holds our local endpoint address. Thus we reverse the dst and the 6922 * src in the lookup. 6923 */ 6924 inp = NULL; 6925 net = NULL; 6926 stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst, 6927 (struct sockaddr *)&src, 6928 &inp, &net, 1, 6929 SCTP_DEFAULT_VRFID); 6930 if ((stcb != NULL) && 6931 (net != NULL) && 6932 (inp != NULL)) { 6933 /* Check the UDP port numbers */ 6934 if ((udp->uh_dport != net->port) || 6935 (udp->uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) { 6936 SCTP_TCB_UNLOCK(stcb); 6937 return; 6938 } 6939 /* Check the verification tag */ 6940 if (ntohl(sh->v_tag) != 0) { 6941 /* 6942 * This must be the verification tag used for 6943 * sending out packets. We don't consider packets 6944 * reflecting the verification tag. 6945 */ 6946 if (ntohl(sh->v_tag) != stcb->asoc.peer_vtag) { 6947 SCTP_TCB_UNLOCK(stcb); 6948 return; 6949 } 6950 } else { 6951 if (ntohs(outer_ip->ip_len) >= 6952 sizeof(struct ip) + 6953 8 + (inner_ip->ip_hl << 2) + 8 + 20) { 6954 /* 6955 * In this case we can check if we got an 6956 * INIT chunk and if the initiate tag 6957 * matches. 6958 */ 6959 ch = (struct sctp_init_chunk *)(sh + 1); 6960 if ((ch->ch.chunk_type != SCTP_INITIATION) || 6961 (ntohl(ch->init.initiate_tag) != stcb->asoc.my_vtag)) { 6962 SCTP_TCB_UNLOCK(stcb); 6963 return; 6964 } 6965 } else { 6966 SCTP_TCB_UNLOCK(stcb); 6967 return; 6968 } 6969 } 6970 type = icmp->icmp_type; 6971 code = icmp->icmp_code; 6972 if ((type == ICMP_UNREACH) && 6973 (code == ICMP_UNREACH_PORT)) { 6974 code = ICMP_UNREACH_PROTOCOL; 6975 } 6976 sctp_notify(inp, stcb, net, type, code, 6977 ntohs(inner_ip->ip_len), 6978 (uint32_t)ntohs(icmp->icmp_nextmtu)); 6979 } else { 6980 if ((stcb == NULL) && (inp != NULL)) { 6981 /* reduce ref-count */ 6982 SCTP_INP_WLOCK(inp); 6983 SCTP_INP_DECR_REF(inp); 6984 SCTP_INP_WUNLOCK(inp); 6985 } 6986 if (stcb) { 6987 SCTP_TCB_UNLOCK(stcb); 6988 } 6989 } 6990 return; 6991 } 6992 #endif 6993 6994 #ifdef INET6 6995 static void 6996 sctp_recv_icmp6_tunneled_packet(int cmd, struct sockaddr *sa, void *d, void *ctx SCTP_UNUSED) 6997 { 6998 struct ip6ctlparam *ip6cp; 6999 struct sctp_inpcb *inp; 7000 struct sctp_tcb *stcb; 7001 struct sctp_nets *net; 7002 struct sctphdr sh; 7003 struct udphdr udp; 7004 struct sockaddr_in6 src, dst; 7005 uint8_t type, code; 7006 7007 ip6cp = (struct ip6ctlparam *)d; 7008 /* 7009 * XXX: We assume that when IPV6 is non NULL, M and OFF are valid. 7010 */ 7011 if (ip6cp->ip6c_m == NULL) { 7012 return; 7013 } 7014 /* 7015 * Check if we can safely examine the ports and the verification tag 7016 * of the SCTP common header. 7017 */ 7018 if (ip6cp->ip6c_m->m_pkthdr.len < 7019 ip6cp->ip6c_off + sizeof(struct udphdr) + offsetof(struct sctphdr, checksum)) { 7020 return; 7021 } 7022 /* Copy out the UDP header. */ 7023 memset(&udp, 0, sizeof(struct udphdr)); 7024 m_copydata(ip6cp->ip6c_m, 7025 ip6cp->ip6c_off, 7026 sizeof(struct udphdr), 7027 (caddr_t)&udp); 7028 /* Copy out the port numbers and the verification tag. */ 7029 memset(&sh, 0, sizeof(struct sctphdr)); 7030 m_copydata(ip6cp->ip6c_m, 7031 ip6cp->ip6c_off + sizeof(struct udphdr), 7032 sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t), 7033 (caddr_t)&sh); 7034 memset(&src, 0, sizeof(struct sockaddr_in6)); 7035 src.sin6_family = AF_INET6; 7036 src.sin6_len = sizeof(struct sockaddr_in6); 7037 src.sin6_port = sh.src_port; 7038 src.sin6_addr = ip6cp->ip6c_ip6->ip6_src; 7039 if (in6_setscope(&src.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) { 7040 return; 7041 } 7042 memset(&dst, 0, sizeof(struct sockaddr_in6)); 7043 dst.sin6_family = AF_INET6; 7044 dst.sin6_len = sizeof(struct sockaddr_in6); 7045 dst.sin6_port = sh.dest_port; 7046 dst.sin6_addr = ip6cp->ip6c_ip6->ip6_dst; 7047 if (in6_setscope(&dst.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) { 7048 return; 7049 } 7050 inp = NULL; 7051 net = NULL; 7052 stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst, 7053 (struct sockaddr *)&src, 7054 &inp, &net, 1, SCTP_DEFAULT_VRFID); 7055 if ((stcb != NULL) && 7056 (net != NULL) && 7057 (inp != NULL)) { 7058 /* Check the UDP port numbers */ 7059 if ((udp.uh_dport != net->port) || 7060 (udp.uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) { 7061 SCTP_TCB_UNLOCK(stcb); 7062 return; 7063 } 7064 /* Check the verification tag */ 7065 if (ntohl(sh.v_tag) != 0) { 7066 /* 7067 * This must be the verification tag used for 7068 * sending out packets. We don't consider packets 7069 * reflecting the verification tag. 7070 */ 7071 if (ntohl(sh.v_tag) != stcb->asoc.peer_vtag) { 7072 SCTP_TCB_UNLOCK(stcb); 7073 return; 7074 } 7075 } else { 7076 if (ip6cp->ip6c_m->m_pkthdr.len >= 7077 ip6cp->ip6c_off + sizeof(struct udphdr) + 7078 sizeof(struct sctphdr) + 7079 sizeof(struct sctp_chunkhdr) + 7080 offsetof(struct sctp_init, a_rwnd)) { 7081 /* 7082 * In this case we can check if we got an 7083 * INIT chunk and if the initiate tag 7084 * matches. 7085 */ 7086 uint32_t initiate_tag; 7087 uint8_t chunk_type; 7088 7089 m_copydata(ip6cp->ip6c_m, 7090 ip6cp->ip6c_off + 7091 sizeof(struct udphdr) + 7092 sizeof(struct sctphdr), 7093 sizeof(uint8_t), 7094 (caddr_t)&chunk_type); 7095 m_copydata(ip6cp->ip6c_m, 7096 ip6cp->ip6c_off + 7097 sizeof(struct udphdr) + 7098 sizeof(struct sctphdr) + 7099 sizeof(struct sctp_chunkhdr), 7100 sizeof(uint32_t), 7101 (caddr_t)&initiate_tag); 7102 if ((chunk_type != SCTP_INITIATION) || 7103 (ntohl(initiate_tag) != stcb->asoc.my_vtag)) { 7104 SCTP_TCB_UNLOCK(stcb); 7105 return; 7106 } 7107 } else { 7108 SCTP_TCB_UNLOCK(stcb); 7109 return; 7110 } 7111 } 7112 type = ip6cp->ip6c_icmp6->icmp6_type; 7113 code = ip6cp->ip6c_icmp6->icmp6_code; 7114 if ((type == ICMP6_DST_UNREACH) && 7115 (code == ICMP6_DST_UNREACH_NOPORT)) { 7116 type = ICMP6_PARAM_PROB; 7117 code = ICMP6_PARAMPROB_NEXTHEADER; 7118 } 7119 sctp6_notify(inp, stcb, net, type, code, 7120 ntohl(ip6cp->ip6c_icmp6->icmp6_mtu)); 7121 } else { 7122 if ((stcb == NULL) && (inp != NULL)) { 7123 /* reduce inp's ref-count */ 7124 SCTP_INP_WLOCK(inp); 7125 SCTP_INP_DECR_REF(inp); 7126 SCTP_INP_WUNLOCK(inp); 7127 } 7128 if (stcb) { 7129 SCTP_TCB_UNLOCK(stcb); 7130 } 7131 } 7132 } 7133 #endif 7134 7135 void 7136 sctp_over_udp_stop(void) 7137 { 7138 /* 7139 * This function assumes sysctl caller holds sctp_sysctl_info_lock() 7140 * for writting! 7141 */ 7142 #ifdef INET 7143 if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) { 7144 soclose(SCTP_BASE_INFO(udp4_tun_socket)); 7145 SCTP_BASE_INFO(udp4_tun_socket) = NULL; 7146 } 7147 #endif 7148 #ifdef INET6 7149 if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) { 7150 soclose(SCTP_BASE_INFO(udp6_tun_socket)); 7151 SCTP_BASE_INFO(udp6_tun_socket) = NULL; 7152 } 7153 #endif 7154 } 7155 7156 int 7157 sctp_over_udp_start(void) 7158 { 7159 uint16_t port; 7160 int ret; 7161 #ifdef INET 7162 struct sockaddr_in sin; 7163 #endif 7164 #ifdef INET6 7165 struct sockaddr_in6 sin6; 7166 #endif 7167 /* 7168 * This function assumes sysctl caller holds sctp_sysctl_info_lock() 7169 * for writting! 7170 */ 7171 port = SCTP_BASE_SYSCTL(sctp_udp_tunneling_port); 7172 if (ntohs(port) == 0) { 7173 /* Must have a port set */ 7174 return (EINVAL); 7175 } 7176 #ifdef INET 7177 if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) { 7178 /* Already running -- must stop first */ 7179 return (EALREADY); 7180 } 7181 #endif 7182 #ifdef INET6 7183 if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) { 7184 /* Already running -- must stop first */ 7185 return (EALREADY); 7186 } 7187 #endif 7188 #ifdef INET 7189 if ((ret = socreate(PF_INET, &SCTP_BASE_INFO(udp4_tun_socket), 7190 SOCK_DGRAM, IPPROTO_UDP, 7191 curthread->td_ucred, curthread))) { 7192 sctp_over_udp_stop(); 7193 return (ret); 7194 } 7195 /* Call the special UDP hook. */ 7196 if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp4_tun_socket), 7197 sctp_recv_udp_tunneled_packet, 7198 sctp_recv_icmp_tunneled_packet, 7199 NULL))) { 7200 sctp_over_udp_stop(); 7201 return (ret); 7202 } 7203 /* Ok, we have a socket, bind it to the port. */ 7204 memset(&sin, 0, sizeof(struct sockaddr_in)); 7205 sin.sin_len = sizeof(struct sockaddr_in); 7206 sin.sin_family = AF_INET; 7207 sin.sin_port = htons(port); 7208 if ((ret = sobind(SCTP_BASE_INFO(udp4_tun_socket), 7209 (struct sockaddr *)&sin, curthread))) { 7210 sctp_over_udp_stop(); 7211 return (ret); 7212 } 7213 #endif 7214 #ifdef INET6 7215 if ((ret = socreate(PF_INET6, &SCTP_BASE_INFO(udp6_tun_socket), 7216 SOCK_DGRAM, IPPROTO_UDP, 7217 curthread->td_ucred, curthread))) { 7218 sctp_over_udp_stop(); 7219 return (ret); 7220 } 7221 /* Call the special UDP hook. */ 7222 if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp6_tun_socket), 7223 sctp_recv_udp_tunneled_packet, 7224 sctp_recv_icmp6_tunneled_packet, 7225 NULL))) { 7226 sctp_over_udp_stop(); 7227 return (ret); 7228 } 7229 /* Ok, we have a socket, bind it to the port. */ 7230 memset(&sin6, 0, sizeof(struct sockaddr_in6)); 7231 sin6.sin6_len = sizeof(struct sockaddr_in6); 7232 sin6.sin6_family = AF_INET6; 7233 sin6.sin6_port = htons(port); 7234 if ((ret = sobind(SCTP_BASE_INFO(udp6_tun_socket), 7235 (struct sockaddr *)&sin6, curthread))) { 7236 sctp_over_udp_stop(); 7237 return (ret); 7238 } 7239 #endif 7240 return (0); 7241 } 7242 7243 /* 7244 * sctp_min_mtu ()returns the minimum of all non-zero arguments. 7245 * If all arguments are zero, zero is returned. 7246 */ 7247 uint32_t 7248 sctp_min_mtu(uint32_t mtu1, uint32_t mtu2, uint32_t mtu3) 7249 { 7250 if (mtu1 > 0) { 7251 if (mtu2 > 0) { 7252 if (mtu3 > 0) { 7253 return (min(mtu1, min(mtu2, mtu3))); 7254 } else { 7255 return (min(mtu1, mtu2)); 7256 } 7257 } else { 7258 if (mtu3 > 0) { 7259 return (min(mtu1, mtu3)); 7260 } else { 7261 return (mtu1); 7262 } 7263 } 7264 } else { 7265 if (mtu2 > 0) { 7266 if (mtu3 > 0) { 7267 return (min(mtu2, mtu3)); 7268 } else { 7269 return (mtu2); 7270 } 7271 } else { 7272 return (mtu3); 7273 } 7274 } 7275 } 7276 7277 void 7278 sctp_hc_set_mtu(union sctp_sockstore *addr, uint16_t fibnum, uint32_t mtu) 7279 { 7280 struct in_conninfo inc; 7281 7282 memset(&inc, 0, sizeof(struct in_conninfo)); 7283 inc.inc_fibnum = fibnum; 7284 switch (addr->sa.sa_family) { 7285 #ifdef INET 7286 case AF_INET: 7287 inc.inc_faddr = addr->sin.sin_addr; 7288 break; 7289 #endif 7290 #ifdef INET6 7291 case AF_INET6: 7292 inc.inc_flags |= INC_ISIPV6; 7293 inc.inc6_faddr = addr->sin6.sin6_addr; 7294 break; 7295 #endif 7296 default: 7297 return; 7298 } 7299 tcp_hc_updatemtu(&inc, (u_long)mtu); 7300 } 7301 7302 uint32_t 7303 sctp_hc_get_mtu(union sctp_sockstore *addr, uint16_t fibnum) 7304 { 7305 struct in_conninfo inc; 7306 7307 memset(&inc, 0, sizeof(struct in_conninfo)); 7308 inc.inc_fibnum = fibnum; 7309 switch (addr->sa.sa_family) { 7310 #ifdef INET 7311 case AF_INET: 7312 inc.inc_faddr = addr->sin.sin_addr; 7313 break; 7314 #endif 7315 #ifdef INET6 7316 case AF_INET6: 7317 inc.inc_flags |= INC_ISIPV6; 7318 inc.inc6_faddr = addr->sin6.sin6_addr; 7319 break; 7320 #endif 7321 default: 7322 return (0); 7323 } 7324 return ((uint32_t)tcp_hc_getmtu(&inc)); 7325 } 7326