Lines Matching defs:sctp

128 sctp_sendmsg(sctp_t *sctp, mblk_t *mp, int flags)
136 uint16_t sid = sctp->sctp_def_stream;
137 uint32_t ppid = sctp->sctp_def_ppid;
138 uint32_t context = sctp->sctp_def_context;
139 uint16_t msg_flags = sctp->sctp_def_flags;
142 uint32_t timetolive = sctp->sctp_def_timetolive;
143 conn_t *connp = sctp->sctp_connp;
179 fp = sctp_lookup_faddr(sctp, addr);
229 RUN_SCTP(sctp);
230 sctp_user_abort(sctp, mp);
237 RUN_SCTP(sctp);
240 if (sctp->sctp_state > SCTPS_ESTABLISHED ||
241 (sctp->sctp_connp->conn_state_flags & CONN_CLOSING)) {
267 if (sctp->sctp_state >= SCTPS_COOKIE_ECHOED &&
268 sid >= sctp->sctp_num_ostr) {
270 sctp_sendfail_event(sctp, dupmsg(mproto), SCTP_ERR_BAD_SID,
278 sctp_sendfail_event(sctp, dupmsg(mproto),
285 if (sctp->sctp_xmit_unsent == NULL) {
286 sctp->sctp_xmit_unsent = sctp->sctp_xmit_unsent_tail = mproto;
288 sctp->sctp_xmit_unsent_tail->b_next = mproto;
289 sctp->sctp_xmit_unsent_tail = mproto;
291 sctp->sctp_unsent += msg_len;
292 BUMP_LOCAL(sctp->sctp_msgcount);
296 if (SCTP_TXQ_LEN(sctp) >= connp->conn_sndbuf) {
297 sctp->sctp_txq_full = 1;
298 sctp->sctp_ulp_txq_full(sctp->sctp_ulpd, B_TRUE);
300 if (sctp->sctp_state == SCTPS_ESTABLISHED)
301 sctp_output(sctp, UINT_MAX);
303 WAKE_SCTP(sctp);
306 WAKE_SCTP(sctp);
320 sctp_chunkify(sctp_t *sctp, int mss, int firstseg_len, int bytes_to_send)
330 mblk_t *mdblk = sctp->sctp_xmit_unsent;
335 sctp_stack_t *sctps = sctp->sctp_sctps;
344 fp = sctp->sctp_current;
346 xtralen = sctp->sctp_hdr_len + sctps->sctps_wroff_xtra +
349 xtralen = sctp->sctp_hdr6_len + sctps->sctps_wroff_xtra +
353 next_msg_hdr = (sctp_msg_hdr_t *)sctp->sctp_xmit_unsent->b_rptr;
387 if (SCTP_MSG_TO_BE_ABANDONED(mdblk, msg_hdr, sctp)) {
388 sctp->sctp_xmit_unsent = mdblk->b_next;
389 if (sctp->sctp_xmit_unsent == NULL)
390 sctp->sctp_xmit_unsent_tail = NULL;
391 ASSERT(sctp->sctp_unsent >= msg_hdr->smh_msglen);
392 sctp->sctp_unsent -= msg_hdr->smh_msglen;
394 BUMP_LOCAL(sctp->sctp_prsctpdrop);
399 if (!SCTP_IS_DETACHED(sctp))
400 SCTP_TXQ_UPDATE(sctp);
401 sctp_sendfail_event(sctp, mdblk, 0, B_FALSE);
431 return (sctp->sctp_xmit_tail);
465 return (sctp->sctp_xmit_tail);
506 sctp->sctp_xmit_unsent = mdblk->b_next;
508 sctp->sctp_xmit_unsent_tail = NULL;
512 if (sctp->sctp_xmit_tail == NULL) {
513 sctp->sctp_xmit_head = sctp->sctp_xmit_tail = mdblk;
515 mp = sctp->sctp_xmit_tail;
522 if (bytes_to_send > 0 && sctp->sctp_xmit_unsent != NULL) {
523 mdblk = sctp->sctp_xmit_unsent;
526 fp1 = sctp->sctp_current;
540 xtralen = sctp->sctp_hdr_len;
542 xtralen = sctp->sctp_hdr6_len;
549 return (sctp->sctp_xmit_tail);
568 sctp_add_proto_hdr(sctp_t *sctp, sctp_faddr_t *fp, mblk_t *mp, int sacklen,
574 sctp_stack_t *sctps = sctp->sctp_sctps;
580 hdrlen = sctp->sctp_hdr_len;
581 hdr = sctp->sctp_iphc;
583 hdrlen = sctp->sctp_hdr6_len;
584 hdr = sctp->sctp_iphc6;
599 sctp_get_dest(sctp, fp);
632 sctp_fill_sack(sctp, mp->b_rptr + hdrlen, sacklen);
634 if (fp != sctp->sctp_current) {
643 } else if (sctp->sctp_bound_to_all) {
652 } else if (sctp->sctp_bound_to_all) {
666 sctp_get_padding(sctp_t *sctp, int pad)
671 ASSERT(sctp->sctp_pad_mp != NULL);
672 if ((fill = dupb(sctp->sctp_pad_mp)) != NULL) {
692 sctp_find_fast_rexmit_mblks(sctp_t *sctp, int *total, sctp_faddr_t **fp)
705 sctp_stack_t *sctps = sctp->sctp_sctps;
707 for (meta = sctp->sctp_xmit_head; meta != NULL; meta = meta->b_next) {
710 SCTP_MSG_TO_BE_ABANDONED(meta, msg_hdr, sctp)) {
729 *fp = sctp->sctp_current;
756 fill = sctp_get_padding(sctp, extra);
764 BUMP_LOCAL(sctp->sctp_rxtchunks);
779 sctp->sctp_chk_fast_rexmit = B_FALSE;
815 sctp_get_msg_to_send(sctp_t *sctp, mblk_t **mp, mblk_t *meta, int *error,
826 ASSERT(sctp->sctp_current != NULL);
835 if (!SCTP_MSG_TO_BE_ABANDONED(meta, msg_hdr, sctp)) {
841 sctp->sctp_xmit_head, meta));
861 *error = sctp_check_abandoned_msg(sctp, meta);
864 ASSERT(sctp_verify_chain(sctp->sctp_xmit_head,
865 sctp->sctp_xmit_tail));
871 BUMP_LOCAL(sctp->sctp_prsctpdrop);
872 ASSERT(sctp->sctp_unsent >= msg_hdr->smh_msglen);
874 ASSERT(sctp->sctp_xmit_head == meta);
875 sctp->sctp_xmit_head = tmp_meta;
876 if (sctp->sctp_xmit_tail == meta)
877 sctp->sctp_xmit_tail = tmp_meta;
882 if (sctp->sctp_xmit_tail == meta)
883 sctp->sctp_xmit_tail = meta->b_prev;
889 if (sctp->sctp_xmit_tail == meta)
890 sctp->sctp_xmit_tail = tmp_meta;
894 sctp->sctp_unsent -= msg_hdr->smh_msglen;
899 if (!SCTP_IS_DETACHED(sctp))
900 SCTP_TXQ_UPDATE(sctp);
901 sctp_sendfail_event(sctp, meta, 0, B_TRUE);
906 if (cansend > 0 && sctp->sctp_xmit_unsent != NULL) {
907 ASSERT(sctp->sctp_unsent > 0);
909 fp = SCTP_CHUNK_DEST(sctp->sctp_xmit_unsent);
911 fp = sctp->sctp_current;
916 fp1 = SCTP_CHUNK_DEST(sctp->sctp_xmit_unsent);
922 meta = sctp_chunkify(sctp, fp->sf_pmss, firstseg_len, cansend);
934 if (SCTP_CHUNK_ISSENT(sctp->sctp_xmit_tail->b_cont)) {
936 mp1 = sctp->sctp_xmit_tail->b_cont;
942 if ((meta = sctp->sctp_xmit_tail->b_next) == NULL)
949 ASSERT(sctp_verify_chain(sctp->sctp_xmit_head, sctp->sctp_xmit_tail));
955 sctp_fast_rexmit(sctp_t *sctp)
960 sctp_stack_t *sctps = sctp->sctp_sctps;
962 ASSERT(sctp->sctp_xmit_head != NULL);
963 mp = sctp_find_fast_rexmit_mblks(sctp, &pktlen, &fp);
968 if ((head = sctp_add_proto_hdr(sctp, fp, mp, 0, NULL)) == NULL) {
979 sctp_set_iplen(sctp, head, fp->sf_ixa);
981 BUMP_LOCAL(sctp->sctp_opkts);
982 sctp->sctp_active = fp->sf_lastactive = ddi_get_lbolt64();
986 sctp_output(sctp_t *sctp, uint_t num_pkt)
991 mblk_t *meta = sctp->sctp_xmit_tail;
1007 sctp_stack_t *sctps = sctp->sctp_sctps;
1010 if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) {
1016 (sizeof (sctp_sack_frag_t) * sctp->sctp_sack_gaps);
1017 lfp = sctp->sctp_lastdata;
1020 lfp = sctp->sctp_current;
1023 cansend = sctp->sctp_frwnd;
1024 if (sctp->sctp_unsent < cansend)
1025 cansend = sctp->sctp_unsent;
1032 if ((cansend < sctp->sctp_current->sf_pmss / 2) &&
1033 (sctp->sctp_unacked != 0) &&
1034 (sctp->sctp_unacked < sctp->sctp_current->sf_pmss) &&
1035 !sctp->sctp_ndelay ||
1036 (cansend == 0 && sctp->sctp_unacked == 0 &&
1037 sctp->sctp_unsent != 0)) {
1039 fp = sctp->sctp_current;
1056 meta = sctp_get_msg_to_send(sctp, &mp,
1061 fp = sctp->sctp_current;
1064 sctp->sctp_xmit_tail = meta;
1079 fp = sctp->sctp_current;
1103 head = sctp_add_proto_hdr(sctp, fp, nmp, sacklen,
1117 SCTP_CHUNK_SENT(sctp, mp, sdc,
1130 fp = sctp->sctp_current;
1150 head = sctp_add_proto_hdr(sctp, fp, nmp, 0, &error);
1163 SCTP_CHUNK_SENT(sctp, mp, sdc,
1174 SCTP_CHUNK_SENT(sctp, mp, sdc, fp, chunklen, meta);
1183 if (sctp->sctp_out_time == 0 && tsn == (sctp->sctp_ltsn - 1)) {
1184 sctp->sctp_out_time = now;
1185 sctp->sctp_rtt_tsn = tsn;
1188 fill = sctp_get_padding(sctp, extra);
1214 meta = sctp_get_msg_to_send(sctp, &mp,
1223 sctp->sctp_xmit_tail = meta;
1246 fill = sctp_get_padding(sctp, extra);
1259 SCTP_CHUNK_SENT(sctp, mp, sdc, fp, chunklen, meta);
1279 ntohs(sdc->sdh_ssn), (void *)fp, sctp->sctp_frwnd,
1280 cansend, sctp->sctp_lastack_rxd));
1281 sctp_set_iplen(sctp, head, fp->sf_ixa);
1283 BUMP_LOCAL(sctp->sctp_opkts);
1286 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1289 sctp->sctp_active = now;
1294 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1397 * for the chunk is obtained from sctp->sctp_adv_pap. The caller
1401 sctp_make_ftsn_chunk(sctp_t *sctp, sctp_faddr_t *fp, sctp_ftsn_set_t *sets,
1410 sctp_stack_t *sctps = sctp->sctp_sctps;
1414 xtralen = sctp->sctp_hdr_len + sctps->sctps_wroff_xtra;
1416 xtralen = sctp->sctp_hdr6_len + sctps->sctps_wroff_xtra;
1434 U32_TO_ABE32(sctp->sctp_adv_pap, advtsn);
1449 * messages whose TSN is less than sctp->sctp_adv_pap and creates
1457 sctp_make_ftsns(sctp_t *sctp, mblk_t *meta, mblk_t *mp, mblk_t **nmp,
1469 uint32_t adv_pap = sctp->sctp_adv_pap;
1472 sctp_stack_t *sctps = sctp->sctp_sctps;
1478 SEQ_GEQ(sctp->sctp_adv_pap, ntohl(sdc->sdh_tsn))) {
1487 sctp->sctp_adv_pap = adv_pap;
1510 *nmp = sctp_make_ftsn_chunk(sctp, fp, sets, nsets, *seglen);
1514 if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) {
1519 (sizeof (sctp_sack_frag_t) * sctp->sctp_sack_gaps);
1520 if (*seglen + sacklen > sctp->sctp_lastdata->sf_pmss) {
1524 fp = sctp->sctp_lastdata;
1527 head = sctp_add_proto_hdr(sctp, fp, *nmp, sacklen, NULL);
1544 SEQ_GEQ(sctp->sctp_adv_pap, ntohl(sdc->sdh_tsn))) {
1551 SCTP_CHUNK_SENT(sctp, mp1, sdc, fp, clen,
1574 ASSERT(sctp->sctp_unsent >= unsent);
1575 sctp->sctp_unsent -= unsent;
1580 if (!SCTP_IS_DETACHED(sctp))
1581 SCTP_TXQ_UPDATE(sctp);
1593 sctp_check_adv_ack_pt(sctp_t *sctp, mblk_t *meta, mblk_t *mp)
1595 uint32_t tsn = sctp->sctp_adv_pap;
1601 ASSERT(SEQ_GT(ntohl(sdc->sdh_tsn), sctp->sctp_lastack_rxd));
1604 !SCTP_MSG_TO_BE_ABANDONED(meta, msg_hdr, sctp)) {
1624 !SCTP_MSG_TO_BE_ABANDONED(meta, msg_hdr, sctp)) {
1629 sctp->sctp_adv_pap = tsn;
1639 sctp->sctp_adv_pap = tsn;
1665 sctp_rexmit(sctp_t *sctp, sctp_faddr_t *oldfp)
1670 mblk_t *meta = sctp->sctp_xmit_head;
1678 uint32_t adv_pap = sctp->sctp_adv_pap;
1683 sctp_stack_t *sctps = sctp->sctp_sctps;
1719 if (SEQ_GT(tsn, sctp->sctp_lastack_rxd)) {
1720 if (sctp->sctp_prsctp_aware && ftsn_check) {
1721 if (SEQ_GEQ(sctp->sctp_adv_pap, tsn)) {
1722 ASSERT(sctp->sctp_prsctp_aware);
1726 sctp_check_adv_ack_pt(sctp,
1728 if (SEQ_GT(sctp->sctp_adv_pap,
1741 if (meta != NULL && sctp->sctp_prsctp_aware) {
1745 SCTP_MSG_TO_BE_ABANDONED(meta, mhdr, sctp))) {
1755 if (sctp->sctp_unacked == 0 && sctp->sctp_unsent != 0) {
1760 if (sctp->sctp_frwnd < (oldfp->sf_pmss - sizeof (*sdc)))
1761 sctp->sctp_frwnd = oldfp->sf_pmss - sizeof (*sdc);
1764 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn;
1771 sctp_output(sctp, 1);
1774 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn - 1;
1775 ASSERT(sctp->sctp_rxt_maxtsn >= sctp->sctp_rxt_nxttsn);
1776 sctp->sctp_zero_win_probe = B_TRUE;
1791 if (sctp->sctp_zero_win_probe) {
1801 fp = sctp_rotate_faddr(sctp, oldfp);
1802 pkt = sctp_rexmit_packet(sctp, &meta, &mp, fp, &pkt_len);
1805 sctp_set_iplen(sctp, pkt, fp->sf_ixa);
1807 BUMP_LOCAL(sctp->sctp_opkts);
1817 sctp->sctp_strikes++;
1819 SCTP_CALC_RXT(sctp, oldfp, sctp->sctp_rto_max);
1821 SCTP_FADDR_TIMER_RESTART(sctp, oldfp, fp->sf_rto);
1822 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
1835 fp = sctp_rotate_faddr(sctp, oldfp);
1841 sctp_make_ftsns(sctp, meta, mp, &nmp, fp, &seglen);
1843 sctp->sctp_adv_pap = adv_pap;
1865 if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) {
1870 (sizeof (sctp_sack_frag_t) * sctp->sctp_sack_gaps);
1871 if (seglen + sacklen > sctp->sctp_lastdata->sf_pmss) {
1883 if (sctp->sctp_lastdata != oldfp &&
1884 sctp->sctp_lastdata->sf_state ==
1886 fp = sctp->sctp_lastdata;
1895 if (sctp->sctp_out_time != 0 &&
1896 SEQ_GEQ(sctp->sctp_rtt_tsn, sdc->sdh_tsn)) {
1897 sctp->sctp_out_time = 0;
1907 sctp_set_faddr_current(sctp, fp);
1913 fill = sctp_get_padding(sctp, extra);
1923 head = sctp_add_proto_hdr(sctp, fp, nmp, sacklen, NULL);
1931 SCTP_CHUNK_SENT(sctp, mp, sdc, fp, chunklen, meta);
1955 sctp)) {
1966 meta = sctp_get_msg_to_send(sctp, &mp, NULL, &error,
1988 fill = sctp_get_padding(sctp, extra);
1999 SCTP_CHUNK_SENT(sctp, mp, sdc, fp, chunklen, meta);
2020 (void *)fp, sctp->sctp_frwnd, sctp->sctp_lastack_rxd));
2022 sctp->sctp_rexmitting = B_TRUE;
2023 sctp->sctp_rxt_nxttsn = first_ua_tsn;
2024 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn - 1;
2025 sctp_set_iplen(sctp, head, fp->sf_ixa);
2027 BUMP_LOCAL(sctp->sctp_opkts);
2035 sctp->sctp_strikes++;
2036 SCTP_CALC_RXT(sctp, oldfp, sctp->sctp_rto_max);
2044 SCTP_FADDR_TIMER_RESTART(sctp, oldfp, oldfp->sf_rto);
2059 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
2061 sctp->sctp_active = ddi_get_lbolt64();
2074 sctp_rexmit_packet(sctp_t *sctp, mblk_t **meta, mblk_t **mp, sctp_faddr_t *fp,
2096 fill = sctp_get_padding(sctp, extra);
2106 head = sctp_add_proto_hdr(sctp, fp, nmp, 0, NULL);
2111 SCTP_CHUNK_SENT(sctp, *mp, sdc, fp, chunklen, *meta);
2115 if (!sctp->sctp_zero_win_probe)
2116 sctp->sctp_rxt_nxttsn = ntohl(sdc->sdh_tsn);
2143 sctp)) {
2156 if (SEQ_GT(ntohl(sdc->sdh_tsn), sctp->sctp_rxt_maxtsn))
2169 fill = sctp_get_padding(sctp, extra);
2180 SCTP_CHUNK_SENT(sctp, *mp, sdc, fp, chunklen, *meta);
2184 if (!sctp->sctp_zero_win_probe)
2185 sctp->sctp_rxt_nxttsn = ntohl(sdc->sdh_tsn);
2207 sctp_ss_rexmit(sctp_t *sctp)
2217 sctp_stack_t *sctps = sctp->sctp_sctps;
2219 ASSERT(!sctp->sctp_zero_win_probe);
2225 if (SEQ_GEQ(sctp->sctp_lastack_rxd, sctp->sctp_rxt_nxttsn))
2226 sctp->sctp_rxt_nxttsn = sctp->sctp_lastack_rxd + 1;
2229 ASSERT(SEQ_LEQ(sctp->sctp_rxt_nxttsn, sctp->sctp_rxt_maxtsn));
2235 fp = sctp->sctp_current;
2270 for (meta = sctp->sctp_xmit_head; meta != NULL; meta = meta->b_next) {
2274 SCTP_MSG_TO_BE_ABANDONED(meta, mhdr, sctp)) {
2283 if (ntohl(sdc->sdh_tsn) == sctp->sctp_rxt_nxttsn)
2293 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
2294 pkt = sctp_rexmit_packet(sctp, &meta, &mp, fp, &pkt_len);
2309 sctp_set_iplen(sctp, pkt, fp->sf_ixa);
2311 BUMP_LOCAL(sctp->sctp_opkts);