| 1516 | } |
| 1517 | |
| 1518 | static int |
| 1519 | sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize, |
| 1520 | void *p) |
| 1521 | { |
| 1522 | struct sctp_inpcb *inp = NULL; |
| 1523 | int error, val = 0; |
| 1524 | struct sctp_tcb *stcb = NULL; |
| 1525 | |
| 1526 | if (optval == NULL) { |
| 1527 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); |
| 1528 | return (EINVAL); |
| 1529 | } |
| 1530 | |
| 1531 | inp = (struct sctp_inpcb *)so->so_pcb; |
| 1532 | if (inp == NULL) { |
| 1533 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); |
| 1534 | return EINVAL; |
| 1535 | } |
| 1536 | error = 0; |
| 1537 | |
| 1538 | switch (optname) { |
| 1539 | case SCTP_NODELAY: |
| 1540 | case SCTP_AUTOCLOSE: |
| 1541 | case SCTP_EXPLICIT_EOR: |
| 1542 | case SCTP_AUTO_ASCONF: |
| 1543 | case SCTP_DISABLE_FRAGMENTS: |
| 1544 | case SCTP_I_WANT_MAPPED_V4_ADDR: |
| 1545 | case SCTP_USE_EXT_RCVINFO: |
| 1546 | SCTP_INP_RLOCK(inp); |
| 1547 | switch (optname) { |
| 1548 | case SCTP_DISABLE_FRAGMENTS: |
| 1549 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NO_FRAGMENT); |
| 1550 | break; |
| 1551 | case SCTP_I_WANT_MAPPED_V4_ADDR: |
| 1552 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4); |
| 1553 | break; |
| 1554 | case SCTP_AUTO_ASCONF: |
| 1555 | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { |
| 1556 | /* only valid for bound all sockets */ |
| 1557 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTO_ASCONF); |
| 1558 | } else { |
| 1559 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); |
| 1560 | error = EINVAL; |
| 1561 | goto flags_out; |
| 1562 | } |
| 1563 | break; |
| 1564 | case SCTP_EXPLICIT_EOR: |
| 1565 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); |
| 1566 | break; |
| 1567 | case SCTP_NODELAY: |
| 1568 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NODELAY); |
| 1569 | break; |
| 1570 | case SCTP_USE_EXT_RCVINFO: |
| 1571 | val = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO); |
| 1572 | break; |
| 1573 | case SCTP_AUTOCLOSE: |
| 1574 | if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTOCLOSE)) |
| 1575 | val = sctp_ticks_to_secs(inp->sctp_ep.auto_close_time); |
no test coverage detected