Changeset 387 for asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c
- Timestamp:
- May 22, 2019, 4:09:18 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c
r375 r387 62 62 #include <netinet/tcp_var.h> 63 63 #include <netapp/resolver.h> 64 extern const ID tmax_tcp_cepid; 65 #include "ff.h" 66 #include "socket_stub.h" 64 #include "fdtable.h" 67 65 #include "kernel_cfg.h" 68 66 67 #ifdef _DEBUG 68 static const char THIS_FILE[] = __FILE__; 69 #endif 70 69 71 #define SOCKET_TIMEOUT 2000000 72 73 struct addrinfo { 74 int ai_flags; 75 int ai_family; 76 int ai_socktype; 77 int ai_protocol; 78 socklen_t ai_addrlen; 79 struct sockaddr *ai_addr; 80 char *ai_canonname; 81 struct addrinfo *ai_next; 82 }; 83 84 typedef uint16_t in_port_t; 85 typedef uint32_t in_addr_t; 86 struct in_addr { in_addr_t s_addr; }; 87 88 struct sockaddr_in { 89 sa_family_t sin_family; 90 in_port_t sin_port; 91 struct in_addr sin_addr; 92 uint8_t sin_zero[8]; 93 }; 94 95 struct in6_addr 96 { 97 union { 98 uint8_t __s6_addr[16]; 99 uint16_t __s6_addr16[8]; 100 uint32_t __s6_addr32[4]; 101 } __in6_union; 102 }; 103 //#define s6_addr __in6_union.__s6_addr 104 //#define s6_addr16 __in6_union.__s6_addr16 105 //#define s6_addr32 __in6_union.__s6_addr32 106 107 struct sockaddr_in6 108 { 109 sa_family_t sin6_family; 110 in_port_t sin6_port; 111 uint32_t sin6_flowinfo; 112 struct in6_addr sin6_addr; 113 uint32_t sin6_scope_id; 114 }; 115 116 typedef struct socket_t { 117 int family; 118 int type; 119 int protocol; 120 int cepid; 121 int repid; 122 int backlog; 123 unsigned int flags; 124 union { 125 struct sockaddr_in laddr4; 126 struct sockaddr_in6 laddr6; 127 }; 128 union { 129 struct sockaddr_in raddr4; 130 struct sockaddr_in6 raddr6; 131 }; 132 int buf_size; 133 unsigned char *buf; 134 void *input; 135 int len; 136 } socket_t; 70 137 71 138 #define tcp6_cre_cep tcp_cre_cep … … 82 149 #define tcp6_set_opt tcp_set_opt 83 150 84 #define udp6_del_cep udp_del_cep85 #define udp6_get_opt udp_get_opt86 #define udp6_set_opt udp_set_opt87 88 151 #ifndef SUPPORT_INET6 89 152 … … 93 156 94 157 ER udp6_cre_cep (ID cepid, T_UDP6_CCEP *pk_ccep) { return E_SYS; } 158 ER udp6_del_cep (ID cepid) { return E_SYS; } 95 159 ER_UINT udp6_snd_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; } 96 160 ER_UINT udp6_rcv_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; } 161 ER udp6_set_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; } 162 ER udp6_get_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; } 97 163 98 164 const T_IN6_ADDR *in6_get_ifaddr (int_t index) { return NULL; } … … 111 177 static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 112 178 static bool_t tcp_fd_readable(struct SHELL_FILE *fp); 179 static bool_t tcp_fd_writable(struct SHELL_FILE *fp); 113 180 static void tcp_fd_delete(struct SHELL_FILE *fp); 114 181 … … 119 186 static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 120 187 static bool_t udp_fd_readable(struct SHELL_FILE *fp); 188 static bool_t udp_fd_writable(struct SHELL_FILE *fp); 121 189 static void udp_fd_delete(struct SHELL_FILE *fp); 122 190 123 IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_ delete };124 IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_ delete };191 IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_writable, tcp_fd_delete }; 192 IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_writable, udp_fd_delete }; 125 193 126 194 typedef struct id_table_t { … … 185 253 186 254 #endif 255 256 void addrcpy(void *_dst, const void *_src, int len) 257 { 258 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 259 memcpy(_dst, _src, len); 260 #else 261 uint8_t *dst = (uint8_t *)_dst, *src = &((uint8_t *)_src)[len]; 262 while (src != _src) 263 *dst++ = *--src; 264 #endif 265 } 187 266 188 267 ID new_id(id_table_t *table, int count) … … 347 426 } 348 427 case SOCK_DGRAM: { 349 ID cepid = new_id(udp _cepid_table, udp_cepid_table_count);428 ID cepid = new_id(udp6_cepid_table, udp6_cepid_table_count); 350 429 if (cepid < 0) 351 430 return -ENOMEM; 352 431 353 T_UDP6_CCEP ccep = { 0, { ntohl(addr_in6->sin6_addr.__in6_union.__s6_addr), ntohs(addr_in6->sin6_port)}, (FP)socket_udp6_callback };432 T_UDP6_CCEP ccep = { 0, { { ntohl(addr_in6->sin6_addr.__in6_union.__s6_addr) }, ntohs(addr_in6->sin6_port)}, (FP)socket_udp6_callback }; 354 433 ret = udp6_cre_cep(cepid, &ccep); 355 434 if (ret != E_OK) { 356 delete_id(udp _cepid_table, udp_cepid_table_count, cepid);435 delete_id(udp6_cepid_table, udp6_cepid_table_count, cepid); 357 436 return -ENOMEM; 358 437 } … … 407 486 408 487 struct sockaddr_in6 *laddr = &socket->laddr6; 409 T_TCP6_CREP crep = { 0, { ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port)} };488 T_TCP6_CREP crep = { 0, { { ntohl(laddr->sin6_addr.__in6_union.__s6_addr) }, ntohs(laddr->sin6_port)} }; 410 489 ret = tcp6_cre_rep(repid, &crep); 411 490 if (ret != E_OK) { … … 423 502 } 424 503 425 int shell_connect(int fd, const struct sockaddr *addr, socklen_t len)504 int shell_connect(int fd, const struct sockaddr *addr, socklen_t alen) 426 505 { 427 506 SOCKET *fp = fd_to_fp(fd); … … 435 514 switch (socket->family) { 436 515 case AF_INET: { 437 if ( len < 8) {516 if (alen < sizeof(struct sockaddr_in)) { 438 517 return -EINVAL; 439 518 } … … 455 534 } 456 535 fp->handle = cepid; 536 fp->writable = 1; 457 537 socket->cepid = cepid; 458 538 } 459 539 struct sockaddr_in *laddr = &socket->laddr4; 460 540 struct sockaddr_in *raddr = &socket->raddr4; 461 memset(raddr, 0, sizeof(*raddr)); 462 memcpy(raddr, addr, len); 541 memcpy(raddr, addr, sizeof(struct sockaddr_in)); 463 542 T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) }; 464 543 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 465 544 ret = tcp_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT); 466 if (ret < 0) { 545 if (ret == E_TMOUT) { 546 return -ETIMEDOUT; 547 } 548 else if (ret < 0) { 467 549 return -EHOSTUNREACH; 468 550 } … … 470 552 } 471 553 case AF_INET6: { 472 if ( len < 20) {554 if (alen < sizeof(struct sockaddr_in6)) { 473 555 return -EINVAL; 474 556 } … … 490 572 } 491 573 fp->handle = cepid; 574 fp->writable = 1; 492 575 socket->cepid = cepid; 493 576 } 494 577 struct sockaddr_in6 *laddr = &socket->laddr6; 495 578 struct sockaddr_in6 *raddr = &socket->raddr6; 496 memset(raddr, 0, sizeof(*raddr)); 497 memcpy(raddr, addr, len); 498 T_IPV6EP lep = { ntohl(laddr->sin6_addr.__in6_union.__s6_addr), ntohs(laddr->sin6_port) }; 499 T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) }; 579 memcpy(raddr, addr, sizeof(struct sockaddr_in6)); 580 T_IPV6EP lep; 581 addrcpy(&lep.ipaddr, &laddr->sin6_addr, 16); 582 lep.portno = ntohs(laddr->sin6_port); 583 T_IPV6EP rep; 584 addrcpy(&rep.ipaddr, &raddr->sin6_addr, 16); 585 rep.portno = ntohs(raddr->sin6_port); 500 586 ret = tcp6_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT); 501 if (ret < 0) { 587 if (ret == E_TMOUT) { 588 return -ETIMEDOUT; 589 } 590 else if (ret < 0) { 502 591 return -EHOSTUNREACH; 503 592 } … … 508 597 } 509 598 599 if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++; 600 510 601 return 0; 511 602 } 512 603 513 int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict len)604 int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict alen) 514 605 { 515 606 SOCKET *lfp = fd_to_fp(fd); … … 550 641 } 551 642 fp->handle = cepid; 643 fp->writable = 1; 552 644 socket->cepid = cepid; 553 645 } … … 555 647 cepid = ((socket_t *)lfp->exinf)->cepid; 556 648 fp->handle = cepid; 649 fp->writable = 1; 557 650 lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid; 558 651 ((socket_t *)lfp->exinf)->cepid = 0; … … 566 659 } 567 660 struct sockaddr_in *raddr = &socket->raddr4; 568 memset(raddr, 0, sizeof( *raddr));661 memset(raddr, 0, sizeof(struct sockaddr_in)); 569 662 raddr->sin_family = AF_INET; 570 663 raddr->sin_port = htons(rep.portno); 571 664 raddr->sin_addr.s_addr = htonl(rep.ipaddr); 572 665 573 if (addr != NULL && len != NULL) {574 int sz = * len;575 if (sz < 8) {666 if (addr != NULL && alen != NULL) { 667 int sz = *alen; 668 if (sz < sizeof(struct sockaddr_in)) { 576 669 return -EINVAL; 577 670 } 578 671 struct sockaddr_in *raddr = &socket->raddr4; 579 if (sz > sizeof( *raddr))580 sz = sizeof( *raddr);672 if (sz > sizeof(struct sockaddr_in)) 673 sz = sizeof(struct sockaddr_in); 581 674 memcpy(addr, raddr, sz); 582 * len = sizeof(*raddr);675 *alen = sz; 583 676 } 584 677 break; … … 603 696 } 604 697 fp->handle = cepid; 698 fp->writable = 1; 605 699 socket->cepid = cepid; 606 700 } … … 608 702 cepid = ((socket_t *)lfp->exinf)->cepid; 609 703 fp->handle = cepid; 704 fp->writable = 1; 610 705 lfp->handle = tmax_tcp6_cepid + ((socket_t *)lfp->exinf)->repid; 611 706 ((socket_t *)lfp->exinf)->cepid = 0; … … 613 708 ((socket_t *)lfp->exinf)->buf = 0; 614 709 } 615 T_IPV6EP rep = { 0, 0 };710 T_IPV6EP rep = { { 0 }, 0 }; 616 711 ret = tcp6_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR); 617 712 if (ret < 0) { … … 619 714 } 620 715 struct sockaddr_in6 *raddr = &socket->raddr6; 621 memset(raddr, 0, sizeof( *raddr));716 memset(raddr, 0, sizeof(struct sockaddr_in6)); 622 717 raddr->sin6_family = AF_INET; 623 718 raddr->sin6_port = htons(rep.portno); 624 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 625 memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16); 626 #else 627 for (int i = 0; i < 16; i++) 628 raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i]; 629 #endif 630 631 if (addr != NULL && len != NULL) { 632 int sz = *len; 633 if (sz < 8) { 719 addrcpy(&raddr->sin6_addr, &rep.ipaddr, 16); 720 721 if (addr != NULL && alen != NULL) { 722 int sz = *alen; 723 if (sz < sizeof(struct sockaddr_in6)) { 634 724 return -EINVAL; 635 725 } 636 726 struct sockaddr_in6 *raddr = &socket->raddr6; 637 if (sz > sizeof( *raddr))638 sz = sizeof( *raddr);727 if (sz > sizeof(struct sockaddr_in6)) 728 sz = sizeof(struct sockaddr_in6); 639 729 memcpy(addr, raddr, sz); 640 * len = sizeof(*raddr);730 *alen = sz; 641 731 } 642 732 break; … … 645 735 return -ENOPROTOOPT; 646 736 } 737 738 if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++; 647 739 648 740 return fp->fd; … … 673 765 } 674 766 else { 767 int temp = len; 675 768 for (;;) { 676 769 ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 677 770 if (ret < 0) { 678 if (ret == E_TMOUT) 679 return -ETIME; 680 return -ECOMM; 771 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 681 772 } 682 773 len -= ret; … … 685 776 buf = (const void *)&((uint8_t *)buf)[ret]; 686 777 } 778 ret = temp; 687 779 } 688 780 break; 689 781 } 690 782 case SOCK_DGRAM: { 691 int sz = alen; 692 if ((addr == NULL) || (sz < 8)) { 783 if ((addr == NULL) || (alen < sizeof(struct sockaddr_in))) { 693 784 return -EINVAL; 694 785 } 695 786 struct sockaddr_in *raddr = &socket->raddr4; 696 memset(raddr, 0, sizeof(*raddr)); 697 memcpy(raddr, addr, sz); 787 memcpy(raddr, addr, sizeof(struct sockaddr_in)); 698 788 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 699 789 ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len, 700 790 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 701 791 if (ret < 0) { 702 return (ret == E_TMOUT) ? -E TIME: -ECOMM;792 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 703 793 } 704 794 break; … … 721 811 } 722 812 else { 813 int temp = len; 723 814 for (;;) { 724 815 ret = tcp6_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 725 816 if (ret < 0) { 726 if (ret == E_TMOUT) 727 return -ETIME; 728 return -ECOMM; 817 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 729 818 } 730 819 len -= ret; … … 732 821 break; 733 822 buf = (const void *)&((uint8_t *)buf)[ret]; 734 } 823 } 824 ret = temp; 735 825 } 736 826 break; 737 827 } 738 828 case SOCK_DGRAM: { 739 int sz = alen; 740 if ((addr == NULL) || (sz < 8)) { 829 if ((addr == NULL) || (alen < sizeof(struct sockaddr_in6))) { 741 830 return -EINVAL; 742 831 } 743 832 struct sockaddr_in6 *raddr = &socket->raddr6; 744 memset(raddr, 0, sizeof(*raddr)); 745 memcpy(raddr, addr, sz); 746 T_IPV6EP rep = { ntohl(raddr->sin6_addr.__in6_union.__s6_addr), ntohs(raddr->sin6_port) }; 833 memcpy(raddr, addr, sizeof(struct sockaddr_in6)); 834 T_IPV6EP rep; 835 addrcpy(&rep.ipaddr, &raddr->sin6_addr, 16); 836 rep.portno = ntohs(raddr->sin6_port); 747 837 ret = udp6_snd_dat(socket->cepid, &rep, (void *)buf, len, 748 838 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 749 839 if (ret < 0) { 750 return (ret == E_TMOUT) ? -E TIME: -ECOMM;840 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 751 841 } 752 842 break; … … 758 848 return -ENOPROTOOPT; 759 849 } 850 851 if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++; 760 852 761 853 return ret; … … 800 892 syslog(LOG_ERROR, "sig_sem => %d", ret); 801 893 } 802 ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_FEVR); 894 ret = tcp_rcv_buf(socket->cepid, &socket->input, 895 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 803 896 if (ret < 0) { 804 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); 805 return -ECOMM; 897 if ((socket->flags & O_NONBLOCK) == 0) 898 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); 899 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 806 900 } 807 901 rsz = ret; … … 858 952 if ((socket->flags & O_NONBLOCK) == 0) 859 953 syslog(LOG_ERROR, "udp_rcv_buf => %d", ret); 860 return (ret == E_TMOUT) ? -E TIME: -ECOMM;954 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 861 955 } 862 956 rsz = ret; … … 867 961 } 868 962 int sz = *alen; 869 memset(raddr, 0, sizeof(s ocket->raddr4));963 memset(raddr, 0, sizeof(struct sockaddr_in)); 870 964 raddr->sin_family = AF_INET; 871 965 raddr->sin_port = htons(rep.portno); 872 966 raddr->sin_addr.s_addr = htonl(rep.ipaddr); 873 if (sz > sizeof(s ocket->raddr4))874 sz = sizeof(s ocket->raddr4);967 if (sz > sizeof(struct sockaddr_in)) 968 sz = sizeof(struct sockaddr_in); 875 969 memcpy(addr, raddr, sz); 876 970 *alen = sz; … … 889 983 if ((addr != NULL) && (alen != NULL)) { 890 984 int sz = *alen; 891 if (sz > sizeof(s ocket->raddr4))892 sz = sizeof(s ocket->raddr4);985 if (sz > sizeof(struct sockaddr_in)) 986 sz = sizeof(struct sockaddr_in); 893 987 memcpy(addr, raddr, sz); 894 988 *alen = sz; … … 934 1028 syslog(LOG_ERROR, "sig_sem => %d", ret); 935 1029 } 936 ret = tcp6_rcv_buf(socket->cepid, &socket->input, TMO_FEVR); 1030 ret = tcp6_rcv_buf(socket->cepid, &socket->input, 1031 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 937 1032 if (ret < 0) { 938 syslog(LOG_ERROR, "tcp6_rcv_buf => %d", ret); 939 return -ECOMM; 1033 if ((socket->flags & O_NONBLOCK) == 0) 1034 syslog(LOG_ERROR, "tcp6_rcv_buf => %d", ret); 1035 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 940 1036 } 941 1037 rsz = ret; … … 986 1082 } 987 1083 988 T_IPV6EP rep = { 0, 0 };1084 T_IPV6EP rep = { { 0 }, 0 }; 989 1085 ret = udp6_rcv_dat(socket->cepid, &rep, buf, len, 990 1086 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); … … 992 1088 if ((socket->flags & O_NONBLOCK) == 0) 993 1089 syslog(LOG_ERROR, "udp6_rcv_buf => %d", ret); 994 return (ret == E_TMOUT) ? -E TIME: -ECOMM;1090 return (ret == E_TMOUT) ? -EAGAIN : -ECOMM; 995 1091 } 996 1092 rsz = ret; … … 1001 1097 } 1002 1098 int sz = *alen; 1003 memset(raddr, 0, sizeof(s ocket->raddr6));1099 memset(raddr, 0, sizeof(struct sockaddr_in6)); 1004 1100 raddr->sin6_family = AF_INET; 1005 1101 raddr->sin6_port = htons(rep.portno); 1006 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1007 memcpy(raddr->sin6_addr.__in6_union.__s6_addr, rep.ipaddr.__u6_addr.__u6_addr8, 16); 1008 #else 1009 for (int i = 0; i < 16; i++) 1010 raddr->sin6_addr.__in6_union.__s6_addr[i] = rep.ipaddr.__u6_addr.__u6_addr8[i]; 1011 #endif 1012 if (sz > sizeof(socket->raddr6)) 1013 sz = sizeof(socket->raddr6); 1102 addrcpy(&raddr->sin6_addr, &rep.ipaddr, 16); 1103 if (sz > sizeof(struct sockaddr_in6)) 1104 sz = sizeof(struct sockaddr_in6); 1014 1105 memcpy(addr, raddr, sz); 1015 1106 *alen = sz; … … 1028 1119 if ((addr != NULL) && (alen != NULL)) { 1029 1120 int sz = *alen; 1030 if (sz > sizeof(s ocket->raddr6))1031 sz = sizeof(s ocket->raddr6);1121 if (sz > sizeof(struct sockaddr_in6)) 1122 sz = sizeof(struct sockaddr_in6); 1032 1123 memcpy(addr, raddr, sz); 1033 1124 *alen = sz; … … 1054 1145 return -ENOPROTOOPT; 1055 1146 } 1147 1148 if (fp->readevt_w != fp->readevt_r) fp->readevt_r++; 1056 1149 1057 1150 return ret; … … 1427 1520 struct sockaddr_in6 laddr; 1428 1521 laddr.sin6_family = AF_INET; 1429 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1430 memcpy(laddr.sin6_addr.__in6_union.__s6_addr, laddr6->__u6_addr.__u6_addr8, 16); 1431 #else 1432 for (int i = 0; i < 16; i++) 1433 laddr.sin6_addr.__in6_union.__s6_addr[i] = laddr6->__u6_addr.__u6_addr8[i]; 1434 #endif 1522 addrcpy(&laddr.sin6_addr, laddr6, 16); 1435 1523 laddr.sin6_port = socket->laddr6.sin6_port; 1436 1524 *len = sizeof(struct sockaddr_in6); … … 1465 1553 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 1466 1554 if ((ret < 0) || (ret2 < 0)) { 1467 return (ret == E_TMOUT) ? -ETIME : -EINVAL;1555 return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO; 1468 1556 } 1469 1557 } … … 1494 1582 delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid); 1495 1583 if ((ret < 0) || (ret2 < 0)) { 1496 return (ret == E_TMOUT) ? -ETIME : -EINVAL;1584 return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO; 1497 1585 } 1498 1586 } … … 1535 1623 int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg) 1536 1624 { 1625 socket_t *socket = (socket_t *)fp->exinf; 1626 1627 switch (req) { 1628 case F_GETFL: 1629 return socket->flags; 1630 case F_SETFL: 1631 socket->flags = (unsigned int)arg; 1632 return 0; 1633 } 1634 1537 1635 return -EINVAL; 1538 1636 } … … 1571 1669 } 1572 1670 1671 bool_t tcp_fd_writable(struct SHELL_FILE *fp) 1672 { 1673 //socket_t *socket = (socket_t *)fp->exinf; 1674 1675 return /*fp->writable &&*/ (fp->writeevt_w == fp->writeevt_r); 1676 } 1677 1573 1678 void tcp_fd_delete(struct SHELL_FILE *fp) 1574 1679 { … … 1590 1695 return E_PAR; 1591 1696 1697 socket_t *socket = (socket_t *)fp->exinf; 1592 1698 int fd = fp->fd; 1593 1699 FD_SET(fd, (fd_set *)&flgptn); … … 1603 1709 syslog(LOG_ERROR, "wai_sem => %d", ret); 1604 1710 } 1605 socket_t *socket = (socket_t *)fp->exinf;1606 1711 socket->len += len; 1607 1712 ret = sig_sem(SEM_FILEDESC); … … 1670 1775 return E_PAR; 1671 1776 1777 socket_t *socket = (socket_t *)fp->exinf; 1672 1778 int fd = fp->fd; 1673 1779 FD_SET(fd, (fd_set *)&flgptn); … … 1683 1789 syslog(LOG_ERROR, "wai_sem => %d", ret); 1684 1790 } 1685 socket_t *socket = (socket_t *)fp->exinf;1686 1791 socket->len += len; 1687 1792 ret = sig_sem(SEM_FILEDESC); … … 1806 1911 } 1807 1912 1913 bool_t udp_fd_writable(struct SHELL_FILE *fp) 1914 { 1915 //socket_t *socket = (socket_t *)fp->exinf; 1916 1917 return fp->writable && (fp->writeevt_w == fp->writeevt_r); 1918 } 1919 1808 1920 void udp_fd_delete(struct SHELL_FILE *fp) 1809 1921 { … … 1849 1961 socket->input = udppara->input; 1850 1962 socket->buf = GET_UDP_SDU(udppara->input, udppara->off); 1851 memset(&socket->raddr4, 0, sizeof(s ocket->raddr4));1963 memset(&socket->raddr4, 0, sizeof(struct sockaddr_in)); 1852 1964 socket->raddr4.sin_family = AF_INET; 1853 1965 socket->raddr4.sin_port = htons(udppara->rep4.portno); … … 1932 2044 socket->input = udppara->input; 1933 2045 socket->buf = GET_UDP_SDU(udppara->input, udppara->off); 1934 memset(&socket->raddr6, 0, sizeof(s ocket->raddr6));2046 memset(&socket->raddr6, 0, sizeof(struct sockaddr_in6)); 1935 2047 socket->raddr6.sin6_family = AF_INET; 1936 2048 socket->raddr6.sin6_port = htons(udppara->rep6.portno); 1937 #if _NET_CFG_BYTE_ORDER == _NET_CFG_BIG_ENDIAN 1938 memcpy(socket->raddr6.sin6_addr.__in6_union.__s6_addr, udppara->rep6.ipaddr.__u6_addr.__u6_addr8, 16); 1939 #else 1940 for (int i = 0; i < 16; i++) 1941 socket->raddr6.sin6_addr.__in6_union.__s6_addr[i] = udppara->rep6.ipaddr.__u6_addr.__u6_addr8[i]; 1942 #endif 2049 addrcpy(&socket->raddr6.sin6_addr, &udppara->rep6.ipaddr, 16); 1943 2050 udppara->input->flags |= NB_FLG_NOREL_IFOUT; 1944 2051 ret = sig_sem(SEM_FILEDESC);
Note:
See TracChangeset
for help on using the changeset viewer.