|
10 | 10 | * Linux (bottom) side of NSOS (Native Simulator Offloaded Sockets).
|
11 | 11 | */
|
12 | 12 |
|
| 13 | +#define _DEFAULT_SOURCE |
| 14 | + |
13 | 15 | #include <errno.h>
|
14 | 16 | #include <fcntl.h>
|
15 | 17 | #include <netdb.h>
|
|
25 | 27 | #include "nsos_errno.h"
|
26 | 28 | #include "nsos_fcntl.h"
|
27 | 29 | #include "nsos_netdb.h"
|
| 30 | +#include "nsos_socket.h" |
28 | 31 |
|
29 | 32 | #include "board_soc.h"
|
30 | 33 | #include "irq_ctrl.h"
|
@@ -511,6 +514,167 @@ int nsos_adapt_recvfrom(int fd, void *buf, size_t len, int flags,
|
511 | 514 | return ret;
|
512 | 515 | }
|
513 | 516 |
|
| 517 | +static int nsos_adapt_getsockopt_int(int fd, int level, int optname, |
| 518 | + void *optval, size_t *nsos_mid_optlen) |
| 519 | +{ |
| 520 | + socklen_t optlen = *nsos_mid_optlen; |
| 521 | + int ret; |
| 522 | + |
| 523 | + ret = getsockopt(fd, level, optname, optval, &optlen); |
| 524 | + if (ret < 0) { |
| 525 | + return -errno_to_nsos_mid(errno); |
| 526 | + } |
| 527 | + |
| 528 | + *nsos_mid_optlen = optlen; |
| 529 | + |
| 530 | + return 0; |
| 531 | +} |
| 532 | + |
| 533 | +int nsos_adapt_getsockopt(int fd, int nsos_mid_level, int nsos_mid_optname, |
| 534 | + void *nsos_mid_optval, size_t *nsos_mid_optlen) |
| 535 | +{ |
| 536 | + switch (nsos_mid_level) { |
| 537 | + case NSOS_MID_SOL_SOCKET: |
| 538 | + switch (nsos_mid_optname) { |
| 539 | + case NSOS_MID_SO_ERROR: { |
| 540 | + int err; |
| 541 | + socklen_t optlen = sizeof(err); |
| 542 | + int ret; |
| 543 | + |
| 544 | + ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &optlen); |
| 545 | + if (ret < 0) { |
| 546 | + return -errno_to_nsos_mid(errno); |
| 547 | + } |
| 548 | + |
| 549 | + *(int *)nsos_mid_optval = errno_to_nsos_mid(err); |
| 550 | + |
| 551 | + return 0; |
| 552 | + } |
| 553 | + case NSOS_MID_SO_TYPE: { |
| 554 | + int type; |
| 555 | + socklen_t optlen = sizeof(type); |
| 556 | + int ret; |
| 557 | + int err; |
| 558 | + |
| 559 | + ret = getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &optlen); |
| 560 | + if (ret < 0) { |
| 561 | + return -errno_to_nsos_mid(errno); |
| 562 | + } |
| 563 | + |
| 564 | + err = socket_type_to_nsos_mid(type, nsos_mid_optval); |
| 565 | + if (err) { |
| 566 | + return err; |
| 567 | + } |
| 568 | + |
| 569 | + return 0; |
| 570 | + } |
| 571 | + case NSOS_MID_SO_PROTOCOL: { |
| 572 | + int proto; |
| 573 | + socklen_t optlen = sizeof(proto); |
| 574 | + int ret; |
| 575 | + int err; |
| 576 | + |
| 577 | + ret = getsockopt(fd, SOL_SOCKET, SO_PROTOCOL, &proto, &optlen); |
| 578 | + if (ret < 0) { |
| 579 | + return -errno_to_nsos_mid(errno); |
| 580 | + } |
| 581 | + |
| 582 | + err = socket_proto_to_nsos_mid(proto, nsos_mid_optval); |
| 583 | + if (err) { |
| 584 | + return err; |
| 585 | + } |
| 586 | + |
| 587 | + return 0; |
| 588 | + } |
| 589 | + case NSOS_MID_SO_DOMAIN: { |
| 590 | + int family; |
| 591 | + socklen_t optlen = sizeof(family); |
| 592 | + int ret; |
| 593 | + int err; |
| 594 | + |
| 595 | + ret = getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &family, &optlen); |
| 596 | + if (ret < 0) { |
| 597 | + return -errno_to_nsos_mid(errno); |
| 598 | + } |
| 599 | + |
| 600 | + err = socket_family_to_nsos_mid(family, nsos_mid_optval); |
| 601 | + if (err) { |
| 602 | + return err; |
| 603 | + } |
| 604 | + |
| 605 | + return 0; |
| 606 | + } |
| 607 | + case NSOS_MID_SO_RCVBUF: |
| 608 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_RCVBUF, |
| 609 | + nsos_mid_optval, nsos_mid_optlen); |
| 610 | + case NSOS_MID_SO_SNDBUF: |
| 611 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_SNDBUF, |
| 612 | + nsos_mid_optval, nsos_mid_optlen); |
| 613 | + case NSOS_MID_SO_REUSEADDR: |
| 614 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR, |
| 615 | + nsos_mid_optval, nsos_mid_optlen); |
| 616 | + case NSOS_MID_SO_REUSEPORT: |
| 617 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_REUSEPORT, |
| 618 | + nsos_mid_optval, nsos_mid_optlen); |
| 619 | + case NSOS_MID_SO_LINGER: |
| 620 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_LINGER, |
| 621 | + nsos_mid_optval, nsos_mid_optlen); |
| 622 | + case NSOS_MID_SO_KEEPALIVE: |
| 623 | + return nsos_adapt_getsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, |
| 624 | + nsos_mid_optval, nsos_mid_optlen); |
| 625 | + } |
| 626 | + } |
| 627 | + |
| 628 | + return -NSOS_MID_EOPNOTSUPP; |
| 629 | +} |
| 630 | + |
| 631 | +static int nsos_adapt_setsockopt_int(int fd, int level, int optname, |
| 632 | + const void *optval, size_t optlen) |
| 633 | +{ |
| 634 | + int ret; |
| 635 | + |
| 636 | + ret = setsockopt(fd, level, optname, optval, optlen); |
| 637 | + if (ret < 0) { |
| 638 | + return -errno_to_nsos_mid(errno); |
| 639 | + } |
| 640 | + |
| 641 | + return 0; |
| 642 | +} |
| 643 | + |
| 644 | +int nsos_adapt_setsockopt(int fd, int nsos_mid_level, int nsos_mid_optname, |
| 645 | + const void *nsos_mid_optval, size_t nsos_mid_optlen) |
| 646 | +{ |
| 647 | + switch (nsos_mid_level) { |
| 648 | + case NSOS_MID_SOL_SOCKET: |
| 649 | + switch (nsos_mid_optname) { |
| 650 | + case NSOS_MID_SO_PRIORITY: |
| 651 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, |
| 652 | + nsos_mid_optval, nsos_mid_optlen); |
| 653 | + |
| 654 | + case NSOS_MID_SO_RCVBUF: |
| 655 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_RCVBUF, |
| 656 | + nsos_mid_optval, nsos_mid_optlen); |
| 657 | + case NSOS_MID_SO_SNDBUF: |
| 658 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_SNDBUF, |
| 659 | + nsos_mid_optval, nsos_mid_optlen); |
| 660 | + case NSOS_MID_SO_REUSEADDR: |
| 661 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR, |
| 662 | + nsos_mid_optval, nsos_mid_optlen); |
| 663 | + case NSOS_MID_SO_REUSEPORT: |
| 664 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_REUSEPORT, |
| 665 | + nsos_mid_optval, nsos_mid_optlen); |
| 666 | + case NSOS_MID_SO_LINGER: |
| 667 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_LINGER, |
| 668 | + nsos_mid_optval, nsos_mid_optlen); |
| 669 | + case NSOS_MID_SO_KEEPALIVE: |
| 670 | + return nsos_adapt_setsockopt_int(fd, SOL_SOCKET, SO_KEEPALIVE, |
| 671 | + nsos_mid_optval, nsos_mid_optlen); |
| 672 | + } |
| 673 | + } |
| 674 | + |
| 675 | + return -NSOS_MID_EOPNOTSUPP; |
| 676 | +} |
| 677 | + |
514 | 678 | #define MAP_POLL_EPOLL(_event_from, _event_to) \
|
515 | 679 | if (events_from & (_event_from)) { \
|
516 | 680 | events_from &= ~(_event_from); \
|
|
0 commit comments