Ignore:
Timestamp:
May 22, 2019, 4:09:18 PM (5 years ago)
Author:
coas-nagasima
Message:

ファイルディスクリプタ処理を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c

    r375 r387  
    6262#include <netinet/tcp_var.h>
    6363#include <netapp/resolver.h>
    64 extern const ID tmax_tcp_cepid;
    65 #include "ff.h"
    66 #include "socket_stub.h"
     64#include "fdtable.h"
    6765#include "kernel_cfg.h"
    6866
     67#ifdef _DEBUG
     68static const char THIS_FILE[] = __FILE__;
     69#endif
     70
    6971#define SOCKET_TIMEOUT 2000000
     72
     73struct 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
     84typedef uint16_t in_port_t;
     85typedef uint32_t in_addr_t;
     86struct in_addr { in_addr_t s_addr; };
     87
     88struct 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
     95struct 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
     107struct 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
     116typedef 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;
    70137
    71138#define tcp6_cre_cep tcp_cre_cep
     
    82149#define tcp6_set_opt tcp_set_opt
    83150
    84 #define udp6_del_cep udp_del_cep
    85 #define udp6_get_opt udp_get_opt
    86 #define udp6_set_opt udp_set_opt
    87 
    88151#ifndef SUPPORT_INET6
    89152
     
    93156
    94157ER      udp6_cre_cep (ID cepid, T_UDP6_CCEP *pk_ccep) { return E_SYS; }
     158ER      udp6_del_cep (ID cepid) { return E_SYS; }
    95159ER_UINT udp6_snd_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; }
    96160ER_UINT udp6_rcv_dat (ID cepid, T_IPV6EP *p_dstaddr, void *data, int_t len, TMO tmout) { return E_SYS; }
     161ER      udp6_set_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; }
     162ER      udp6_get_opt (ID cepid, int_t optname, void *optval, int_t optlen) { return E_SYS; }
    97163
    98164const T_IN6_ADDR *in6_get_ifaddr (int_t index) { return NULL; }
     
    111177static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
    112178static bool_t tcp_fd_readable(struct SHELL_FILE *fp);
     179static bool_t tcp_fd_writable(struct SHELL_FILE *fp);
    113180static void tcp_fd_delete(struct SHELL_FILE *fp);
    114181
     
    119186static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg);
    120187static bool_t udp_fd_readable(struct SHELL_FILE *fp);
     188static bool_t udp_fd_writable(struct SHELL_FILE *fp);
    121189static void udp_fd_delete(struct SHELL_FILE *fp);
    122190
    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 };
     191IO_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 };
     192IO_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 };
    125193
    126194typedef struct id_table_t {
     
    185253
    186254#endif
     255
     256void 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}
    187266
    188267ID new_id(id_table_t *table, int count)
     
    347426                }
    348427                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);
    350429                        if (cepid < 0)
    351430                                return -ENOMEM;
    352431
    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 };
    354433                        ret = udp6_cre_cep(cepid, &ccep);
    355434                        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);
    357436                                return -ENOMEM;
    358437                        }
     
    407486
    408487                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)} };
    410489                ret = tcp6_cre_rep(repid, &crep);
    411490                if (ret != E_OK) {
     
    423502}
    424503
    425 int shell_connect(int fd, const struct sockaddr *addr, socklen_t len)
     504int shell_connect(int fd, const struct sockaddr *addr, socklen_t alen)
    426505{
    427506        SOCKET *fp = fd_to_fp(fd);
     
    435514        switch (socket->family) {
    436515        case AF_INET: {
    437                 if (len < 8) {
     516                if (alen < sizeof(struct sockaddr_in)) {
    438517                        return -EINVAL;
    439518                }
     
    455534                        }
    456535                        fp->handle = cepid;
     536                        fp->writable = 1;
    457537                        socket->cepid = cepid;
    458538                }
    459539                struct sockaddr_in *laddr = &socket->laddr4;
    460540                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));
    463542                T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) };
    464543                T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
    465544                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) {
    467549                        return -EHOSTUNREACH;
    468550                }
     
    470552        }
    471553        case AF_INET6: {
    472                 if (len < 20) {
     554                if (alen < sizeof(struct sockaddr_in6)) {
    473555                        return -EINVAL;
    474556                }
     
    490572                        }
    491573                        fp->handle = cepid;
     574                        fp->writable = 1;
    492575                        socket->cepid = cepid;
    493576                }
    494577                struct sockaddr_in6 *laddr = &socket->laddr6;
    495578                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);
    500586                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) {
    502591                        return -EHOSTUNREACH;
    503592                }
     
    508597        }
    509598
     599        if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
     600
    510601        return 0;
    511602}
    512603
    513 int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict len)
     604int shell_accept(int fd, struct sockaddr *__restrict addr, socklen_t *__restrict alen)
    514605{
    515606        SOCKET *lfp = fd_to_fp(fd);
     
    550641                        }
    551642                        fp->handle = cepid;
     643                        fp->writable = 1;
    552644                        socket->cepid = cepid;
    553645                }
     
    555647                        cepid = ((socket_t *)lfp->exinf)->cepid;
    556648                        fp->handle = cepid;
     649                        fp->writable = 1;
    557650                        lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid;
    558651                        ((socket_t *)lfp->exinf)->cepid = 0;
     
    566659                }
    567660                struct sockaddr_in *raddr = &socket->raddr4;
    568                 memset(raddr, 0, sizeof(*raddr));
     661                memset(raddr, 0, sizeof(struct sockaddr_in));
    569662                raddr->sin_family = AF_INET;
    570663                raddr->sin_port = htons(rep.portno);
    571664                raddr->sin_addr.s_addr = htonl(rep.ipaddr);
    572665
    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)) {
    576669                                return -EINVAL;
    577670                        }
    578671                        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);
    581674                        memcpy(addr, raddr, sz);
    582                         *len = sizeof(*raddr);
     675                        *alen = sz;
    583676                }
    584677                break;
     
    603696                        }
    604697                        fp->handle = cepid;
     698                        fp->writable = 1;
    605699                        socket->cepid = cepid;
    606700                }
     
    608702                        cepid = ((socket_t *)lfp->exinf)->cepid;
    609703                        fp->handle = cepid;
     704                        fp->writable = 1;
    610705                        lfp->handle = tmax_tcp6_cepid + ((socket_t *)lfp->exinf)->repid;
    611706                        ((socket_t *)lfp->exinf)->cepid = 0;
     
    613708                        ((socket_t *)lfp->exinf)->buf = 0;
    614709                }
    615                 T_IPV6EP rep = { 0, 0 };
     710                T_IPV6EP rep = { { 0 }, 0 };
    616711                ret = tcp6_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR);
    617712                if (ret < 0) {
     
    619714                }
    620715                struct sockaddr_in6 *raddr = &socket->raddr6;
    621                 memset(raddr, 0, sizeof(*raddr));
     716                memset(raddr, 0, sizeof(struct sockaddr_in6));
    622717                raddr->sin6_family = AF_INET;
    623718                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)) {
    634724                                return -EINVAL;
    635725                        }
    636726                        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);
    639729                        memcpy(addr, raddr, sz);
    640                         *len = sizeof(*raddr);
     730                        *alen = sz;
    641731                }
    642732                break;
     
    645735                return -ENOPROTOOPT;
    646736        }
     737
     738        if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
    647739
    648740        return fp->fd;
     
    673765                        }
    674766                        else {
     767                                int temp = len;
    675768                                for (;;) {
    676769                                        ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
    677770                                        if (ret < 0) {
    678                                                 if (ret == E_TMOUT)
    679                                                         return -ETIME;
    680                                                 return -ECOMM;
     771                                                return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    681772                                        }
    682773                                        len -= ret;
     
    685776                                        buf = (const void *)&((uint8_t *)buf)[ret];
    686777                                }
     778                                ret = temp;
    687779                        }
    688780                        break;
    689781                }
    690782                case SOCK_DGRAM: {
    691                         int sz = alen;
    692                         if ((addr == NULL) || (sz < 8)) {
     783                        if ((addr == NULL) || (alen < sizeof(struct sockaddr_in))) {
    693784                                return -EINVAL;
    694785                        }
    695786                        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));
    698788                        T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) };
    699789                        ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len,
    700790                                (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
    701791                        if (ret < 0) {
    702                                 return (ret == E_TMOUT) ? -ETIME : -ECOMM;
     792                                return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    703793                        }
    704794                        break;
     
    721811                        }
    722812                        else {
     813                                int temp = len;
    723814                                for (;;) {
    724815                                        ret = tcp6_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT);
    725816                                        if (ret < 0) {
    726                                                 if (ret == E_TMOUT)
    727                                                         return -ETIME;
    728                                                 return -ECOMM;
     817                                                return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    729818                                        }
    730819                                        len -= ret;
     
    732821                                                break;
    733822                                        buf = (const void *)&((uint8_t *)buf)[ret];
    734                                 }
     823                                }
     824                                ret = temp;
    735825                        }
    736826                        break;
    737827                }
    738828                case SOCK_DGRAM: {
    739                         int sz = alen;
    740                         if ((addr == NULL) || (sz < 8)) {
     829                        if ((addr == NULL) || (alen < sizeof(struct sockaddr_in6))) {
    741830                                return -EINVAL;
    742831                        }
    743832                        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);
    747837                        ret = udp6_snd_dat(socket->cepid, &rep, (void *)buf, len,
    748838                                (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
    749839                        if (ret < 0) {
    750                                 return (ret == E_TMOUT) ? -ETIME : -ECOMM;
     840                                return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    751841                        }
    752842                        break;
     
    758848                return -ENOPROTOOPT;
    759849        }
     850
     851        if (fp->writeevt_w != fp->writeevt_r) fp->writeevt_r++;
    760852
    761853        return ret;
     
    800892                                                syslog(LOG_ERROR, "sig_sem => %d", ret);
    801893                                        }
    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);
    803896                                        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;
    806900                                        }
    807901                                        rsz = ret;
     
    858952                                        if ((socket->flags & O_NONBLOCK) == 0)
    859953                                                syslog(LOG_ERROR, "udp_rcv_buf => %d", ret);
    860                                         return (ret == E_TMOUT) ? -ETIME : -ECOMM;
     954                                        return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    861955                                }
    862956                                rsz = ret;
     
    867961                                        }
    868962                                        int sz = *alen;
    869                                         memset(raddr, 0, sizeof(socket->raddr4));
     963                                        memset(raddr, 0, sizeof(struct sockaddr_in));
    870964                                        raddr->sin_family = AF_INET;
    871965                                        raddr->sin_port = htons(rep.portno);
    872966                                        raddr->sin_addr.s_addr = htonl(rep.ipaddr);
    873                                         if (sz > sizeof(socket->raddr4))
    874                                                 sz = sizeof(socket->raddr4);
     967                                        if (sz > sizeof(struct sockaddr_in))
     968                                                sz = sizeof(struct sockaddr_in);
    875969                                        memcpy(addr, raddr, sz);
    876970                                        *alen = sz;
     
    889983                                if ((addr != NULL) && (alen != NULL)) {
    890984                                        int sz = *alen;
    891                                         if (sz > sizeof(socket->raddr4))
    892                                                 sz = sizeof(socket->raddr4);
     985                                        if (sz > sizeof(struct sockaddr_in))
     986                                                sz = sizeof(struct sockaddr_in);
    893987                                        memcpy(addr, raddr, sz);
    894988                                        *alen = sz;
     
    9341028                                                syslog(LOG_ERROR, "sig_sem => %d", ret);
    9351029                                        }
    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);
    9371032                                        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;
    9401036                                        }
    9411037                                        rsz = ret;
     
    9861082                                }
    9871083
    988                                 T_IPV6EP rep = { 0, 0 };
     1084                                T_IPV6EP rep = { { 0 }, 0 };
    9891085                                ret = udp6_rcv_dat(socket->cepid, &rep, buf, len,
    9901086                                        (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);
     
    9921088                                        if ((socket->flags & O_NONBLOCK) == 0)
    9931089                                                syslog(LOG_ERROR, "udp6_rcv_buf => %d", ret);
    994                                         return (ret == E_TMOUT) ? -ETIME : -ECOMM;
     1090                                        return (ret == E_TMOUT) ? -EAGAIN : -ECOMM;
    9951091                                }
    9961092                                rsz = ret;
     
    10011097                                        }
    10021098                                        int sz = *alen;
    1003                                         memset(raddr, 0, sizeof(socket->raddr6));
     1099                                        memset(raddr, 0, sizeof(struct sockaddr_in6));
    10041100                                        raddr->sin6_family = AF_INET;
    10051101                                        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);
    10141105                                        memcpy(addr, raddr, sz);
    10151106                                        *alen = sz;
     
    10281119                                if ((addr != NULL) && (alen != NULL)) {
    10291120                                        int sz = *alen;
    1030                                         if (sz > sizeof(socket->raddr6))
    1031                                                 sz = sizeof(socket->raddr6);
     1121                                        if (sz > sizeof(struct sockaddr_in6))
     1122                                                sz = sizeof(struct sockaddr_in6);
    10321123                                        memcpy(addr, raddr, sz);
    10331124                                        *alen = sz;
     
    10541145                return -ENOPROTOOPT;
    10551146        }
     1147
     1148        if (fp->readevt_w != fp->readevt_r) fp->readevt_r++;
    10561149
    10571150        return ret;
     
    14271520                struct sockaddr_in6 laddr;
    14281521                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);
    14351523                laddr.sin6_port = socket->laddr6.sin6_port;
    14361524                *len = sizeof(struct sockaddr_in6);
     
    14651553                        delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid);
    14661554                        if ((ret < 0) || (ret2 < 0)) {
    1467                                 return (ret == E_TMOUT) ? -ETIME : -EINVAL;
     1555                                return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO;
    14681556                        }
    14691557                }
     
    14941582                        delete_id(tcp6_cepid_table, tcp6_cepid_table_count, cepid);
    14951583                        if ((ret < 0) || (ret2 < 0)) {
    1496                                 return (ret == E_TMOUT) ? -ETIME : -EINVAL;
     1584                                return (ret == E_TMOUT) ? -ETIMEDOUT : -EIO;
    14971585                        }
    14981586                }
     
    15351623int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg)
    15361624{
     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
    15371635        return -EINVAL;
    15381636}
     
    15711669}
    15721670
     1671bool_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
    15731678void tcp_fd_delete(struct SHELL_FILE *fp)
    15741679{
     
    15901695                return E_PAR;
    15911696
     1697        socket_t *socket = (socket_t *)fp->exinf;
    15921698        int fd = fp->fd;
    15931699        FD_SET(fd, (fd_set *)&flgptn);
     
    16031709                        syslog(LOG_ERROR, "wai_sem => %d", ret);
    16041710                }
    1605                 socket_t *socket = (socket_t *)fp->exinf;
    16061711                socket->len += len;
    16071712                ret = sig_sem(SEM_FILEDESC);
     
    16701775                return E_PAR;
    16711776
     1777        socket_t *socket = (socket_t *)fp->exinf;
    16721778        int fd = fp->fd;
    16731779        FD_SET(fd, (fd_set *)&flgptn);
     
    16831789                        syslog(LOG_ERROR, "wai_sem => %d", ret);
    16841790                }
    1685                 socket_t *socket = (socket_t *)fp->exinf;
    16861791                socket->len += len;
    16871792                ret = sig_sem(SEM_FILEDESC);
     
    18061911}
    18071912
     1913bool_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
    18081920void udp_fd_delete(struct SHELL_FILE *fp)
    18091921{
     
    18491961                socket->input = udppara->input;
    18501962                socket->buf = GET_UDP_SDU(udppara->input, udppara->off);
    1851                 memset(&socket->raddr4, 0, sizeof(socket->raddr4));
     1963                memset(&socket->raddr4, 0, sizeof(struct sockaddr_in));
    18521964                socket->raddr4.sin_family = AF_INET;
    18531965                socket->raddr4.sin_port = htons(udppara->rep4.portno);
     
    19322044                socket->input = udppara->input;
    19332045                socket->buf = GET_UDP_SDU(udppara->input, udppara->off);
    1934                 memset(&socket->raddr6, 0, sizeof(socket->raddr6));
     2046                memset(&socket->raddr6, 0, sizeof(struct sockaddr_in6));
    19352047                socket->raddr6.sin6_family = AF_INET;
    19362048                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);
    19432050                udppara->input->flags |= NB_FLG_NOREL_IFOUT;
    19442051                ret = sig_sem(SEM_FILEDESC);
Note: See TracChangeset for help on using the changeset viewer.