Lines Matching defs:ssa

137 sosctp_assoc(struct sctp_sonode *ss, sctp_assoc_t id, struct sctp_soassoc **ssa)
139 ASSERT(ssa != NULL);
142 *ssa = NULL;
146 if ((*ssa = ss->ss_assocs[id].ssi_assoc) == NULL) {
149 if (((*ssa)->ssa_state & (SS_CANTSENDMORE|SS_CANTRCVMORE)) ==
154 *ssa = NULL;
157 SSA_REFHOLD(*ssa)
168 struct sctp_soassoc *ssa;
170 ssa = kmem_cache_alloc(sosctp_assoccache, kmflag);
171 if (ssa != NULL) {
172 ssa->ssa_type = SOSCTP_ASSOC;
173 ssa->ssa_refcnt = 1;
174 ssa->ssa_sonode = ss;
175 ssa->ssa_state = 0;
176 ssa->ssa_error = 0;
177 ssa->ssa_snd_qfull = 0;
178 ssa->ssa_rcv_queued = 0;
179 ssa->ssa_flowctrld = B_FALSE;
181 dprint(2, ("sosctp_assoc_create %p %p\n", (void *)ss, (void *)ssa));
182 return (ssa);
186 sosctp_assoc_free(struct sctp_sonode *ss, struct sctp_soassoc *ssa)
190 dprint(2, ("sosctp_assoc_free %p %p (%d)\n", (void *)ss, (void *)ssa,
191 ssa->ssa_id));
193 if (ssa->ssa_conn != NULL) {
196 sctp_recvd(ssa->ssa_conn, so->so_rcvbuf);
197 (void) sctp_disconnect(ssa->ssa_conn);
198 sctp_close(ssa->ssa_conn);
201 ssa->ssa_conn = NULL;
203 sosctp_aid_reserve(ss, ssa->ssa_id, -1);
204 ss->ss_assocs[ssa->ssa_id].ssi_assoc = NULL;
206 kmem_cache_free(sosctp_assoccache, ssa);
309 sosctp_assoc_waitconnected(struct sctp_soassoc *ssa, int fmode)
311 struct sonode *so = &ssa->ssa_sonode->ss_so;
314 ASSERT((ssa->ssa_state & (SS_ISCONNECTED|SS_ISCONNECTING)) ||
315 ssa->ssa_error != 0);
317 while ((ssa->ssa_state & (SS_ISCONNECTED|SS_ISCONNECTING)) ==
318 SS_ISCONNECTING && ssa->ssa_error == 0) {
336 if (ssa->ssa_error != 0) {
337 error = ssa->ssa_error;
338 ssa->ssa_error = 0;
343 if (!(ssa->ssa_state & SS_ISCONNECTED)) {
364 struct sctp_soassoc *ssa;
407 ssa = sosctp_assoc_create(ss, KM_SLEEP);
408 ssa->ssa_wroff = ss->ss_wroff;
409 ssa->ssa_wrsize = ss->ss_wrsize;
410 ssa->ssa_conn = sctp_create(ssa, (struct sctp_s *)so->so_proto_handle,
415 ss->ss_assocs[id].ssi_assoc = ssa;
416 ssa->ssa_id = id;
417 if (ssa->ssa_conn == NULL) {
418 ASSERT(ssa->ssa_refcnt == 1);
419 sosctp_assoc_free(ss, ssa);
423 ssa->ssa_state |= SS_ISBOUND;
425 sosctp_assoc_isconnecting(ssa);
426 SSA_REFHOLD(ssa);
434 error = sctp_set_opt(ssa->ssa_conn, IPPROTO_SCTP, SCTP_INITMSG,
440 if ((error = sctp_connect(ssa->ssa_conn, name, namelen, cr, pid)) != 0)
447 error = sosctp_assoc_waitconnected(ssa, fflag);
462 ASSERT(ssa->ssa_state & (SS_CANTSENDMORE | SS_CANTRCVMORE));
463 SSA_REFRELE(ss, ssa);
464 ssa = NULL;
468 *ssap = ssa;
476 * directly. But since the ssa is inserted to the ss_soassocs
480 if (ssa->ssa_refcnt > 2)
481 ssa->ssa_refcnt -= 2;
483 sosctp_assoc_free(ss, ssa);
514 struct sctp_soassoc *ssa)
527 (ssa->ssa_state & (SS_ISCONNECTED|SS_ISCONNECTING|
529 nso->so_error = ssa->ssa_error;
530 nso->so_snd_qfull = ssa->ssa_snd_qfull;
531 nso->so_proto_props.sopp_wroff = ssa->ssa_wroff;
532 nso->so_proto_props.sopp_maxblk = ssa->ssa_wrsize;
533 nso->so_rcv_queued = ssa->ssa_rcv_queued;
534 nso->so_flowctrld = ssa->ssa_flowctrld;
535 nso->so_proto_handle = (sock_lower_handle_t)ssa->ssa_conn;
565 if (tmp == ssa) {
586 sosctp_assoc_isconnecting(struct sctp_soassoc *ssa)
588 struct sonode *so = &ssa->ssa_sonode->ss_so;
592 ssa->ssa_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
593 ssa->ssa_state |= SS_ISCONNECTING;
598 sosctp_assoc_isconnected(struct sctp_soassoc *ssa)
600 struct sonode *so = &ssa->ssa_sonode->ss_so;
604 ssa->ssa_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING);
605 ssa->ssa_state |= SS_ISCONNECTED;
610 sosctp_assoc_isdisconnecting(struct sctp_soassoc *ssa)
612 struct sonode *so = &ssa->ssa_sonode->ss_so;
616 ssa->ssa_state &= ~SS_ISCONNECTING;
617 ssa->ssa_state |= SS_CANTSENDMORE;
622 sosctp_assoc_isdisconnected(struct sctp_soassoc *ssa, int error)
624 struct sonode *so = &ssa->ssa_sonode->ss_so;
628 ssa->ssa_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
629 ssa->ssa_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE);
631 ssa->ssa_error = (ushort_t)error;