Lines Matching defs:sctp

38 #include <netinet/sctp.h>
95 #define SCTP_IPIF_ZONE_MATCH(sctp, ipif) \
96 IPCL_ZONE_MATCH((sctp)->sctp_connp, (ipif)->sctp_ipif_zoneid)
164 * for the sctp has conn_all_zones set. When looking for an address we
232 sctp_get_all_ipifs(sctp_t *sctp, int sleep)
238 sctp_stack_t *sctps = sctp->sctp_sctps;
240 conn_t *connp = sctp->sctp_connp;
252 !SCTP_IPIF_ZONE_MATCH(sctp, sctp_ipif) ||
265 error = sctp_ipif_hash_insert(sctp, sctp_ipif, sleep,
278 sctp_free_saddrs(sctp);
293 sctp_valid_addr_list(sctp_t *sctp, const void *addrs, uint32_t addrcnt,
308 conn_t *connp = sctp->sctp_connp;
317 if (sctp->sctp_state >= SCTPS_BOUND) {
319 if (sctp->sctp_state > SCTPS_LISTEN)
323 if (sctp->sctp_conn_tfp != NULL)
324 mutex_enter(&sctp->sctp_conn_tfp->tf_lock);
325 if (sctp->sctp_listen_tfp != NULL)
326 mutex_enter(&sctp->sctp_listen_tfp->tf_lock);
389 ifindex, 0, B_TRUE, sctp->sctp_sctps);
409 err = sctp_ipif_hash_insert(sctp, ipif, KM_SLEEP,
430 if (sctp->sctp_nsaddrs > 0) {
431 sctp_free_saddrs(sctp);
432 ASSERT(sctp->sctp_nsaddrs == 0);
434 err = sctp_get_all_ipifs(sctp, KM_SLEEP);
437 sctp->sctp_bound_to_all = 1;
439 if (sctp->sctp_listen_tfp != NULL)
440 mutex_exit(&sctp->sctp_listen_tfp->tf_lock);
441 if (sctp->sctp_conn_tfp != NULL)
442 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
446 sctp_del_saddr_list(sctp, addrs, saddr_cnt, B_TRUE);
447 if (sctp->sctp_listen_tfp != NULL)
448 mutex_exit(&sctp->sctp_listen_tfp->tf_lock);
449 if (sctp->sctp_conn_tfp != NULL)
450 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
455 sctp_ipif_hash_insert(sctp_t *sctp, sctp_ipif_t *ipif, int sleep,
464 rw_enter(&sctp->sctp_saddrs[hindex].ipif_hash_lock, RW_WRITER);
465 ipif_obj = list_head(&sctp->sctp_saddrs[hindex].sctp_ipif_list);
466 for (cnt = 0; cnt < sctp->sctp_saddrs[hindex].ipif_count; cnt++) {
478 &sctp->sctp_saddrs[hindex].ipif_hash_lock);
483 &sctp->sctp_saddrs[hindex].ipif_hash_lock);
487 ipif_obj = list_next(&sctp->sctp_saddrs[hindex].sctp_ipif_list,
492 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
498 list_insert_tail(&sctp->sctp_saddrs[hindex].sctp_ipif_list, ipif_obj);
499 sctp->sctp_saddrs[hindex].ipif_count++;
500 sctp->sctp_nsaddrs++;
501 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
512 sctp_fix_saddr(sctp_t *sctp, in6_addr_t *saddr)
516 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
524 sctp_ipif_hash_remove(sctp_t *sctp, sctp_ipif_t *ipif, boolean_t locked)
533 rw_enter(&sctp->sctp_saddrs[hindex].ipif_hash_lock, RW_WRITER);
534 ipif_obj = list_head(&sctp->sctp_saddrs[hindex].sctp_ipif_list);
535 for (cnt = 0; cnt < sctp->sctp_saddrs[hindex].ipif_count; cnt++) {
538 list_remove(&sctp->sctp_saddrs[hindex].sctp_ipif_list,
540 sctp->sctp_saddrs[hindex].ipif_count--;
541 sctp->sctp_nsaddrs--;
542 sctp_fix_saddr(sctp, &ipif->sctp_ipif_saddr);
547 ipif_obj = list_next(&sctp->sctp_saddrs[hindex].sctp_ipif_list,
551 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
661 sctp_free_saddrs(sctp_t *sctp)
667 if (sctp->sctp_nsaddrs == 0)
670 rw_enter(&sctp->sctp_saddrs[i].ipif_hash_lock, RW_WRITER);
671 if (sctp->sctp_saddrs[i].ipif_count == 0) {
672 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
675 obj = list_tail(&sctp->sctp_saddrs[i].sctp_ipif_list);
676 for (l = 0; l < sctp->sctp_saddrs[i].ipif_count; l++) {
677 list_remove(&sctp->sctp_saddrs[i].sctp_ipif_list, obj);
679 sctp->sctp_nsaddrs--;
681 obj = list_tail(&sctp->sctp_saddrs[i].sctp_ipif_list);
683 sctp->sctp_saddrs[i].ipif_count = 0;
684 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
686 if (sctp->sctp_bound_to_all == 1)
687 sctp->sctp_bound_to_all = 0;
688 ASSERT(sctp->sctp_nsaddrs == 0);
901 sctp_t *sctp;
907 sctp = list_head(&sctps->sctps_g_list);
908 while (sctp != NULL && oipif->sctp_ipif_refcnt > 0) {
909 mutex_enter(&sctp->sctp_reflock);
910 if (sctp->sctp_condemned ||
911 sctp->sctp_saddrs[idx].ipif_count <= 0) {
912 mutex_exit(&sctp->sctp_reflock);
913 sctp = list_next(&sctps->sctps_g_list, sctp);
916 sctp->sctp_refcnt++;
917 mutex_exit(&sctp->sctp_reflock);
922 RUN_SCTP(sctp);
923 sobj = list_head(&sctp->sctp_saddrs[idx].sctp_ipif_list);
925 sctp->sctp_saddrs[idx].ipif_count; count++) {
938 sobj = list_next(&sctp->sctp_saddrs[idx].sctp_ipif_list,
941 WAKE_SCTP(sctp);
942 sctp_prev = sctp;
944 sctp = list_next(&sctps->sctps_g_list, sctp);
1266 * sctp locking by the caller.
1271 sctp_del_saddr(sctp_t *sctp, sctp_saddr_ipif_t *sp)
1273 if (sctp->sctp_conn_tfp != NULL)
1274 mutex_enter(&sctp->sctp_conn_tfp->tf_lock);
1276 if (sctp->sctp_listen_tfp != NULL)
1277 mutex_enter(&sctp->sctp_listen_tfp->tf_lock);
1279 sctp_ipif_hash_remove(sctp, sp->saddr_ipifp, B_FALSE);
1281 if (sctp->sctp_bound_to_all == 1)
1282 sctp->sctp_bound_to_all = 0;
1284 if (sctp->sctp_conn_tfp != NULL)
1285 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
1287 if (sctp->sctp_listen_tfp != NULL)
1288 mutex_exit(&sctp->sctp_listen_tfp->tf_lock);
1296 sctp_del_saddr_list(sctp_t *sctp, const void *addrs, int addcnt,
1305 conn_t *connp = sctp->sctp_connp;
1307 ASSERT(sctp->sctp_nsaddrs >= addcnt);
1310 if (sctp->sctp_conn_tfp != NULL)
1311 mutex_enter(&sctp->sctp_conn_tfp->tf_lock);
1312 if (sctp->sctp_listen_tfp != NULL)
1313 mutex_enter(&sctp->sctp_listen_tfp->tf_lock);
1331 ifindex, 0, B_TRUE, sctp->sctp_sctps);
1333 sctp_ipif_hash_remove(sctp, sctp_ipif, B_FALSE);
1335 if (sctp->sctp_bound_to_all == 1)
1336 sctp->sctp_bound_to_all = 0;
1339 if (sctp->sctp_conn_tfp != NULL)
1340 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
1341 if (sctp->sctp_listen_tfp != NULL)
1342 mutex_exit(&sctp->sctp_listen_tfp->tf_lock);
1351 sctp_saddr_lookup(sctp_t *sctp, in6_addr_t *addr, uint_t ifindex)
1359 rw_enter(&sctp->sctp_saddrs[hindex].ipif_hash_lock, RW_READER);
1360 if (sctp->sctp_saddrs[hindex].ipif_count == 0) {
1361 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
1365 ipif_obj = list_head(&sctp->sctp_saddrs[hindex].sctp_ipif_list);
1366 for (cnt = 0; cnt < sctp->sctp_saddrs[hindex].ipif_count; cnt++) {
1375 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
1378 ipif_obj = list_next(&sctp->sctp_saddrs[hindex].sctp_ipif_list,
1381 rw_exit(&sctp->sctp_saddrs[hindex].ipif_hash_lock);
1387 sctp_saddr_add_addr(sctp_t *sctp, in6_addr_t *addr, uint_t ifindex)
1390 conn_t *connp = sctp->sctp_connp;
1393 !connp->conn_allzones, ifindex, 0, B_TRUE, sctp->sctp_sctps);
1397 if (sctp_ipif_hash_insert(sctp, sctp_ipif, KM_NOSLEEP, B_FALSE,
1411 sctp_check_saddr(sctp_t *sctp, int supp_af, boolean_t delete,
1420 conn_t *connp = sctp->sctp_connp;
1422 ASSERT(!sctp->sctp_loopback && !sctp->sctp_linklocal && supp_af != 0);
1431 nsaddr = sctp->sctp_nsaddrs;
1433 rw_enter(&sctp->sctp_saddrs[i].ipif_hash_lock, RW_WRITER);
1434 if (sctp->sctp_saddrs[i].ipif_count == 0) {
1435 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1438 obj = list_head(&sctp->sctp_saddrs[i].sctp_ipif_list);
1439 naddr = sctp->sctp_saddrs[i].ipif_count;
1466 if (sctp->sctp_bound_to_all == 1)
1467 sctp->sctp_bound_to_all = 0;
1469 obj = list_next(&sctp->sctp_saddrs[i].
1471 sctp_ipif_hash_remove(sctp, ipif,
1475 sctp_ipif_hash_remove(sctp, ipif, B_TRUE);
1479 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1482 obj = list_next(&sctp->sctp_saddrs[i].sctp_ipif_list,
1485 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1492 sctp_get_valid_addr(sctp_t *sctp, boolean_t isv6, boolean_t *addr_set)
1501 rw_enter(&sctp->sctp_saddrs[i].ipif_hash_lock, RW_READER);
1502 if (sctp->sctp_saddrs[i].ipif_count == 0) {
1503 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1506 obj = list_head(&sctp->sctp_saddrs[i].sctp_ipif_list);
1507 for (l = 0; l < sctp->sctp_saddrs[i].ipif_count; l++) {
1515 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1519 if (scanned >= sctp->sctp_nsaddrs) {
1520 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1523 obj = list_next(&sctp->sctp_saddrs[i].sctp_ipif_list,
1526 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1549 sctp_t *sctp = (sctp_t *)conn;
1550 conn_t *connp = sctp->sctp_connp;
1560 if (sctp->sctp_nsaddrs == 0)
1567 if (sctp->sctp_state >= SCTPS_ESTABLISHED && !sctp->sctp_loopback &&
1573 rw_enter(&sctp->sctp_saddrs[i].ipif_hash_lock, RW_READER);
1574 if (sctp->sctp_saddrs[i].ipif_count == 0) {
1575 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1578 obj = list_head(&sctp->sctp_saddrs[i].sctp_ipif_list);
1579 for (l = 0; l < sctp->sctp_saddrs[i].ipif_count; l++) {
1587 if (scanned >= sctp->sctp_nsaddrs) {
1588 rw_exit(&sctp->
1592 obj = list_next(&sctp->sctp_saddrs[i].
1624 if (added >= max || scanned >= sctp->sctp_nsaddrs) {
1625 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1628 obj = list_next(&sctp->sctp_saddrs[i].sctp_ipif_list,
1631 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1645 * be false since the 'sctp' will be that of the listener.
1648 sctp_saddr_info(sctp_t *sctp, int supp_af, uchar_t *p, boolean_t modify)
1666 if (modify && !sctp->sctp_loopback && (cl_sctp_check_addrs == NULL))
1669 if (modify && !sctp->sctp_linklocal)
1672 nsaddr = sctp->sctp_nsaddrs;
1674 rw_enter(&sctp->sctp_saddrs[i].ipif_hash_lock, RW_WRITER);
1675 if (sctp->sctp_saddrs[i].ipif_count == 0) {
1676 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1679 obj = list_head(&sctp->sctp_saddrs[i].sctp_ipif_list);
1680 naddr = sctp->sctp_saddrs[i].ipif_count;
1700 if (sctp->sctp_bound_to_all == 1)
1701 sctp->sctp_bound_to_all = 0;
1703 obj = list_next(&sctp->sctp_saddrs[i].
1705 sctp_ipif_hash_remove(sctp, ipif,
1709 sctp_ipif_hash_remove(sctp, ipif, B_TRUE);
1742 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1745 obj = list_next(&sctp->sctp_saddrs[i].sctp_ipif_list,
1748 rw_exit(&sctp->sctp_saddrs[i].ipif_hash_lock);
1769 sctp_get_addrlist(sctp_t *sctp, const void *addrs, uint32_t *addrcnt,
1779 sctp_stack_t *sctps = sctp->sctp_sctps;
1780 conn_t *connp = sctp->sctp_connp;
1806 if (sctp->sctp_state > SCTPS_LISTEN) {
1831 if (sctp->sctp_state > SCTPS_LISTEN) {
1885 !SCTP_IPIF_ZONE_MATCH(sctp, sctp_ipif) ||
1888 (sctp->sctp_connp->conn_ipv6_v6only &&
1925 sctp_get_saddr_list(sctp_t *sctp, uchar_t *p, size_t psize)
1934 rw_enter(&sctp->sctp_saddrs[cnt].ipif_hash_lock, RW_READER);
1935 if (sctp->sctp_saddrs[cnt].ipif_count == 0) {
1936 rw_exit(&sctp->sctp_saddrs[cnt].ipif_hash_lock);
1939 obj = list_head(&sctp->sctp_saddrs[cnt].sctp_ipif_list);
1940 naddr = sctp->sctp_saddrs[cnt].ipif_count;
1945 rw_exit(&sctp->sctp_saddrs[cnt].ipif_hash_lock);
1955 if (scanned >= sctp->sctp_nsaddrs) {
1956 rw_exit(&sctp->sctp_saddrs[cnt].ipif_hash_lock);
1960 &sctp->sctp_saddrs[icnt].sctp_ipif_list,
1963 rw_exit(&sctp->sctp_saddrs[cnt].ipif_hash_lock);
1972 sctp_get_faddr_list(sctp_t *sctp, uchar_t *p, size_t psize)
1976 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {