Lines Matching defs:sctp

157 validate_init_params(sctp_t *sctp, sctp_chunk_hdr_t *ch,
171 conn_t *connp = sctp->sctp_connp;
244 dprint(1, ("sctp:validate_init_params: host addr\n"));
295 *errmp = sctp_make_err(sctp,
349 sctp->sctp_connp->conn_ipv6_v6only))) {
350 dprint(1, ("sctp:validate_init_params: supp addr\n"));
363 sctp_send_abort(sctp, sctp_init2vtag(ch), SCTP_ERR_MISSING_PARM,
375 sctp_send_abort(sctp, sctp_init2vtag(ch), serror, details,
385 sctp_initialize_params(sctp_t *sctp, sctp_init_chunk_t *init,
389 sctp->sctp_ftsn = ntohl(init->sic_inittsn);
390 sctp->sctp_lastacked = sctp->sctp_ftsn - 1;
393 sctp->sctp_fcsn = sctp->sctp_lastacked;
400 sctp->sctp_fvtag = init->sic_inittag;
401 sctp->sctp_sctph->sh_verf = init->sic_inittag;
402 sctp->sctp_sctph6->sh_verf = init->sic_inittag;
403 sctp->sctp_lvtag = iack->sic_inittag;
406 sctp->sctp_frwnd = ntohl(init->sic_a_rwnd);
409 sctp->sctp_num_ostr = iack->sic_outstr;
410 sctp->sctp_ostrcntrs = kmem_zalloc(sizeof (uint16_t) *
411 sctp->sctp_num_ostr, KM_NOSLEEP);
412 if (sctp->sctp_ostrcntrs == NULL)
415 sctp->sctp_num_istr = iack->sic_instr;
416 sctp->sctp_instr = kmem_zalloc(sizeof (*sctp->sctp_instr) *
417 sctp->sctp_num_istr, KM_NOSLEEP);
418 if (sctp->sctp_instr == NULL) {
419 kmem_free(sctp->sctp_ostrcntrs, sizeof (uint16_t) *
420 sctp->sctp_num_ostr);
421 sctp->sctp_ostrcntrs = NULL;
465 * Note that sctp is the listener, hence we shouldn't modify it.
468 sctp_send_initack(sctp_t *sctp, sctp_hdr_t *initsh, sctp_chunk_hdr_t *ch,
499 sctp_stack_t *sctps = sctp->sctp_sctps;
500 conn_t *connp = sctp->sctp_connp;
504 BUMP_LOCAL(sctp->sctp_ibchunks);
510 ipsctplen = sctp->sctp_ip_hdr_len;
514 ipsctplen = sctp->sctp_ip_hdr6_len;
519 if (!sctp->sctp_connp->conn_ipv6_v6only)
526 if (validate_init_params(sctp, ch, init, initmp, NULL, &errmp,
539 if (sctp->sctp_state <= SCTPS_LISTEN) {
546 } else if (sctp->sctp_state == SCTPS_COOKIE_WAIT ||
547 sctp->sctp_state == SCTPS_COOKIE_ECHOED) {
548 /* init collision; copy vtag and itsn from sctp */
549 itag = sctp->sctp_lvtag;
550 itsn = sctp->sctp_ltsn;
559 * the sctp which should be good enough.
569 itsn = sctp->sctp_ltsn;
579 if (sctp->sctp_send_adaptation)
582 sctp->sctp_prsctp_aware && sctps->sctps_prsctp_enabled) {
583 iacklen += sctp_options_param_len(sctp, SCTP_PRSCTP_OPTION);
586 iacklen += sctp_supaddr_param_len(sctp);
588 iacklen += sctp_addr_params(sctp, supp_af, NULL, B_FALSE);
609 sctp_send_abort(sctp, sctp_init2vtag(ch),
628 * cred labels for sctp connections. We can't be so sure this
630 * directly use sctp. We check for a NULL ira_tsl to cover this
645 sctp_send_abort(sctp, sctp_init2vtag(ch),
660 sctp_send_abort(sctp, sctp_init2vtag(ch),
670 bcopy(sctp->sctp_iphc, p, sctp->sctp_hdr_len);
677 iacksh = (sctp_hdr_t *)(p + sctp->sctp_ip_hdr_len);
678 ixa->ixa_ip_hdr_length = sctp->sctp_ip_hdr_len;
680 bcopy(sctp->sctp_iphc6, p, sctp->sctp_hdr6_len);
687 iacksh = (sctp_hdr_t *)(p + sctp->sctp_ip_hdr6_len);
688 ixa->ixa_ip_hdr_length = sctp->sctp_ip_hdr6_len;
710 iack->sic_a_rwnd = htonl(sctp->sctp_rwnd);
712 iack->sic_outstr = htons(MIN(sctp->sctp_num_ostr,
714 iack->sic_instr = htons(sctp->sctp_num_istr);
717 p += sctp_adaptation_code_param(sctp, (uchar_t *)p);
719 p += sctp_supaddr_param(sctp, (uchar_t *)p);
721 p += sctp_addr_params(sctp, supp_af, (uchar_t *)p, B_FALSE);
723 sctp->sctp_prsctp_aware && sctps->sctps_prsctp_enabled) {
724 p += sctp_options_param(sctp, p, SCTP_PRSCTP_OPTION);
757 *lifetime = sctp->sctp_cookie_lifetime;
761 if (sctp->sctp_state <= SCTPS_COOKIE_WAIT) {
768 *ttag = sctp->sctp_lvtag;
771 *ttag = sctp->sctp_fvtag;
792 iack->sic_outstr = MIN(sctp->sctp_num_ostr, ntohs(init->sic_instr));
793 iack->sic_instr = MIN(sctp->sctp_num_istr, ntohs(init->sic_outstr));
807 (sctp->sctp_last_secret_update +
809 bcopy(sctp->sctp_secret, sctp->sctp_old_secret,
811 (void) random_get_pseudo_bytes(sctp->sctp_secret,
813 sctp->sctp_last_secret_update = nowt;
817 (uchar_t *)sctp->sctp_secret, SCTP_SECRET_LEN, (uchar_t *)p);
856 sctp_send_abort(sctp, sctp_init2vtag(ch),
872 BUMP_LOCAL(sctp->sctp_opkts);
873 BUMP_LOCAL(sctp->sctp_obchunks);
880 sctp_send_cookie_ack(sctp_t *sctp)
884 sctp_stack_t *sctps = sctp->sctp_sctps;
886 camp = sctp_make_mp(sctp, sctp->sctp_current, sizeof (*cach));
899 BUMP_LOCAL(sctp->sctp_obchunks);
901 sctp_set_iplen(sctp, camp, sctp->sctp_current->sf_ixa);
902 (void) conn_ip_output(camp, sctp->sctp_current->sf_ixa);
903 BUMP_LOCAL(sctp->sctp_opkts);
925 sctp_send_cookie_echo(sctp_t *sctp, sctp_chunk_hdr_t *iackch, mblk_t *iackmp,
947 sctp_stack_t *sctps = sctp->sctp_sctps;
952 if (validate_init_params(sctp, iackch, iack, iackmp, &cph, &errmp,
955 sctp_assoc_event(sctp, SCTP_CANT_STR_ASSOC, 0, NULL);
956 sctp_clean_death(sctp, ECONNABORTED);
961 ASSERT(sctp->sctp_cookie_mp == NULL);
969 hdrlen = sctp->sctp_hdr_len;
971 hdrlen = sctp->sctp_hdr6_len;
976 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current,
977 sctp->sctp_current->sf_rto);
985 sctp->sctp_sctph->sh_verf = iack->sic_inittag;
986 sctp->sctp_sctph6->sh_verf = iack->sic_inittag;
987 sctp->sctp_fvtag = iack->sic_inittag;
988 sctp->sctp_ftsn = ntohl(iack->sic_inittsn);
989 sctp->sctp_lastacked = sctp->sctp_ftsn - 1;
990 sctp->sctp_fcsn = sctp->sctp_lastacked;
991 sctp->sctp_frwnd = ntohl(iack->sic_a_rwnd);
994 * Populate sctp with addresses given in the INIT ACK or IP header.
998 sctp->sctp_current->sf_df = B_TRUE;
999 sctp->sctp_ipha->ipha_fragment_offset_and_flags |= IPH_DF_HTONS;
1006 ASSERT(sctp->sctp_conn_tfp != NULL);
1007 tf = sctp->sctp_conn_tfp;
1008 /* sctp isn't a listener so only need to hold conn fanout lock */
1010 if (sctp_get_addrparams(sctp, NULL, iackmp, iackch, NULL) != 0) {
1013 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current,
1014 sctp->sctp_current->sf_rto);
1021 fp = sctp->sctp_current;
1029 old_num_str = sctp->sctp_num_ostr;
1030 if (ntohs(iack->sic_instr) < sctp->sctp_num_ostr)
1031 sctp->sctp_num_ostr = ntohs(iack->sic_instr);
1032 if (sctp->sctp_ostrcntrs == NULL) {
1033 sctp->sctp_ostrcntrs = kmem_zalloc(sizeof (uint16_t) *
1034 sctp->sctp_num_ostr, KM_NOSLEEP);
1037 if (old_num_str != sctp->sctp_num_ostr) {
1038 kmem_free(sctp->sctp_ostrcntrs, sizeof (uint16_t) *
1040 sctp->sctp_ostrcntrs = kmem_zalloc(sizeof (uint16_t) *
1041 sctp->sctp_num_ostr, KM_NOSLEEP);
1044 if (sctp->sctp_ostrcntrs == NULL) {
1046 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1056 old_num_str = sctp->sctp_num_istr;
1057 if (ntohs(iack->sic_outstr) < sctp->sctp_num_istr)
1058 sctp->sctp_num_istr = ntohs(iack->sic_outstr);
1059 if (sctp->sctp_instr == NULL) {
1060 sctp->sctp_instr = kmem_zalloc(sizeof (*sctp->sctp_instr) *
1061 sctp->sctp_num_istr, KM_NOSLEEP);
1064 if (old_num_str != sctp->sctp_num_istr) {
1065 kmem_free(sctp->sctp_instr,
1066 sizeof (*sctp->sctp_instr) * old_num_str);
1067 sctp->sctp_instr = kmem_zalloc(
1068 sizeof (*sctp->sctp_instr) * sctp->sctp_num_istr,
1072 if (sctp->sctp_instr == NULL) {
1073 kmem_free(sctp->sctp_ostrcntrs,
1074 sizeof (uint16_t) * sctp->sctp_num_ostr);
1076 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1082 if (!(sctp_options & SCTP_PRSCTP_OPTION) && sctp->sctp_prsctp_aware)
1083 sctp->sctp_prsctp_aware = B_FALSE;
1087 &sctp->sctp_rx_adaptation_code) == 0) {
1088 sctp->sctp_recv_adaptation = 1;
1102 if (sctp->sctp_unsent > 0) {
1107 mp = sctp->sctp_xmit_unsent;
1110 if (smh->smh_sid >= sctp->sctp_num_ostr) {
1115 sctp->sctp_xmit_unsent = mp->b_next;
1117 sctp_sendfail_event(sctp, mp, SCTP_ERR_BAD_SID,
1122 mp = sctp->sctp_xmit_unsent;
1129 ASSERT(sctp->sctp_unsent >= unsent);
1130 sctp->sctp_unsent -= unsent;
1139 if (!SCTP_IS_DETACHED(sctp))
1140 SCTP_TXQ_UPDATE(sctp);
1142 if (sctp->sctp_xmit_unsent == NULL)
1143 sctp->sctp_xmit_unsent_tail = NULL;
1146 cansend = MIN(sctp->sctp_unsent, sctp->sctp_frwnd);
1147 meta = sctp_get_msg_to_send(sctp, &mp, NULL, &error, ceclen,
1157 sctp->sctp_xmit_tail = meta;
1167 head = sctp_add_proto_hdr(sctp, fp, cemp, 0, NULL);
1170 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1184 BUMP_LOCAL(sctp->sctp_obchunks);
1186 sctp->sctp_cookie_mp = dupmsg(head);
1188 if (sctp->sctp_cookie_mp == NULL) {
1198 SCTP_CHUNK_SENT(sctp, mp, sdc, fp, seglen, meta);
1205 sctp->sctp_state = SCTPS_COOKIE_ECHOED;
1206 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1208 sctp_set_iplen(sctp, head, fp->sf_ixa);
1210 BUMP_LOCAL(sctp->sctp_opkts);
1214 sctp_process_cookie(sctp_t *sctp, sctp_chunk_hdr_t *ch, mblk_t *cmp,
1232 sctp_stack_t *sctps = sctp->sctp_sctps;
1233 conn_t *connp = sctp->sctp_connp;
1235 BUMP_LOCAL(sctp->sctp_ibchunks);
1246 hmac_md5(p, clen, (uchar_t *)sctp->sctp_secret, SCTP_SECRET_LEN,
1254 hmac_md5(p, clen, (uchar_t *)sctp->sctp_old_secret,
1296 if (diff > 0 && (init->sic_inittag != sctp->sctp_fvtag ||
1297 iack->sic_inittag != sctp->sctp_lvtag)) {
1302 sctp_send_abort(sctp, init->sic_inittag, SCTP_ERR_STALE_COOKIE,
1321 &sctp->sctp_rx_adaptation_code) == 0)) {
1327 if (sctp->sctp_state >= SCTPS_COOKIE_WAIT) {
1328 if (sctp->sctp_state == SCTPS_ESTABLISHED &&
1329 init->sic_inittag == sctp->sctp_fvtag &&
1330 iack->sic_inittag == sctp->sctp_lvtag &&
1334 SCTP_PRINTADDR(sctp->sctp_current->sf_faddr),
1339 if (init->sic_inittag != sctp->sctp_fvtag &&
1340 iack->sic_inittag != sctp->sctp_lvtag &&
1341 *fttag == sctp->sctp_fvtag &&
1342 *lttag == sctp->sctp_lvtag) {
1346 sctp->sctp_fvtag = init->sic_inittag;
1347 sctp->sctp_lvtag = iack->sic_inittag;
1349 sctp->sctp_sctph->sh_verf = init->sic_inittag;
1350 sctp->sctp_sctph6->sh_verf = init->sic_inittag;
1352 sctp->sctp_ftsn = ntohl(init->sic_inittsn);
1353 sctp->sctp_lastacked = sctp->sctp_ftsn - 1;
1354 sctp->sctp_frwnd = ntohl(init->sic_a_rwnd);
1355 sctp->sctp_fcsn = sctp->sctp_lastacked;
1357 if (sctp->sctp_state < SCTPS_ESTABLISHED)
1358 SCTP_ASSOC_EST(sctps, sctp);
1360 dprint(1, ("sctp peer %x:%x:%x:%x (%d) restarted\n",
1361 SCTP_PRINTADDR(sctp->sctp_current->sf_faddr),
1364 sctp_congest_reset(sctp);
1367 sctp_instream_cleanup(sctp, B_FALSE);
1369 sctp->sctp_istr_nmsgs = 0;
1370 sctp->sctp_rxqueued = 0;
1371 for (i = 0; i < sctp->sctp_num_ostr; i++) {
1372 sctp->sctp_ostrcntrs[i] = 0;
1377 } else if (init->sic_inittag != sctp->sctp_fvtag &&
1378 iack->sic_inittag == sctp->sctp_lvtag) {
1381 if (sctp->sctp_state < SCTPS_ESTABLISHED) {
1382 if (!sctp_initialize_params(sctp, init, iack))
1384 SCTP_ASSOC_EST(sctps, sctp);
1388 SCTP_PRINTADDR(sctp->sctp_current->sf_faddr),
1392 } else if (iack->sic_inittag != sctp->sctp_lvtag &&
1393 init->sic_inittag == sctp->sctp_fvtag &&
1398 SCTP_PRINTADDR(sctp->sctp_current->sf_faddr),
1401 } else if (init->sic_inittag == sctp->sctp_fvtag &&
1402 iack->sic_inittag == sctp->sctp_lvtag) {
1409 SCTP_PRINTADDR(sctp->sctp_current->sf_faddr),
1411 if (sctp->sctp_state < SCTPS_ESTABLISHED) {
1412 if (!sctp_initialize_params(sctp, init, iack))
1414 SCTP_ASSOC_EST(sctps, sctp);
1430 * function could not find a sctp via the normal lookup routine.
1449 sctp_t *sctp = NULL;
1494 sctp = sctp_conn_match(&srcp, 1, &dst, ports, zoneid,
1498 ("sctp_addrlist2sctp: src=%x:%x:%x:%x, sctp=%p\n",
1499 SCTP_PRINTADDR(src), (void *)sctp));
1502 if (sctp != NULL) {
1503 return (sctp);
1507 sctp = sctp_conn_match(&srcp, 1, &dst, ports, zoneid,
1511 ("sctp_addrlist2sctp: src=%x:%x:%x:%x, sctp=%p\n",
1512 SCTP_PRINTADDR(src), (void *)sctp));
1514 if (sctp != NULL) {
1515 return (sctp);