Fixed bug in tcp select, added NWIOTCPGERROR.
This commit is contained in:
parent
e695deb8f8
commit
6e0bf57f82
3 changed files with 59 additions and 24 deletions
|
@ -281,7 +281,12 @@ unsigned operations;
|
||||||
resops |= SR_SELECT_READ;
|
resops |= SR_SELECT_READ;
|
||||||
}
|
}
|
||||||
if (operations & SR_SELECT_WRITE)
|
if (operations & SR_SELECT_WRITE)
|
||||||
return ENOTCONN; /* Is this right? */
|
{
|
||||||
|
/* We can't handles writes. Just return the error
|
||||||
|
* when the user tries to write.
|
||||||
|
*/
|
||||||
|
resops |= SR_SELECT_WRITE;
|
||||||
|
}
|
||||||
return resops;
|
return resops;
|
||||||
}
|
}
|
||||||
if (tcp_fd->tf_flags & TFF_CONNECTING)
|
if (tcp_fd->tf_flags & TFF_CONNECTING)
|
||||||
|
@ -293,23 +298,36 @@ unsigned operations;
|
||||||
}
|
}
|
||||||
if (operations & SR_SELECT_READ)
|
if (operations & SR_SELECT_READ)
|
||||||
{
|
{
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
|
||||||
return ENOTCONN; /* Is this right? */
|
|
||||||
|
|
||||||
tcp_conn= tcp_fd->tf_conn;
|
tcp_conn= tcp_fd->tf_conn;
|
||||||
|
|
||||||
if (tcp_conn->tc_state == TCS_CLOSED || tcp_sel_read(tcp_conn))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
|
{
|
||||||
|
/* We can't handle reads until a connection has been
|
||||||
|
* established. Return the error when the user tries
|
||||||
|
* to read.
|
||||||
|
*/
|
||||||
resops |= SR_SELECT_READ;
|
resops |= SR_SELECT_READ;
|
||||||
|
}
|
||||||
|
else if (tcp_conn->tc_state == TCS_CLOSED ||
|
||||||
|
tcp_sel_read(tcp_conn))
|
||||||
|
{
|
||||||
|
resops |= SR_SELECT_READ;
|
||||||
|
}
|
||||||
else if (!(operations & SR_SELECT_POLL))
|
else if (!(operations & SR_SELECT_POLL))
|
||||||
tcp_fd->tf_flags |= TFF_SEL_READ;
|
tcp_fd->tf_flags |= TFF_SEL_READ;
|
||||||
}
|
}
|
||||||
if (operations & SR_SELECT_WRITE)
|
if (operations & SR_SELECT_WRITE)
|
||||||
{
|
{
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
|
||||||
return ENOTCONN; /* Is this right? */
|
|
||||||
tcp_conn= tcp_fd->tf_conn;
|
tcp_conn= tcp_fd->tf_conn;
|
||||||
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
if (tcp_conn->tc_state == TCS_CLOSED ||
|
{
|
||||||
|
/* We can't handle writes until a connection has been
|
||||||
|
* established. Return the error when the user tries
|
||||||
|
* to write.
|
||||||
|
*/
|
||||||
|
resops |= SR_SELECT_WRITE;
|
||||||
|
}
|
||||||
|
else if (tcp_conn->tc_state == TCS_CLOSED ||
|
||||||
tcp_conn->tc_flags & TCF_FIN_SENT ||
|
tcp_conn->tc_flags & TCF_FIN_SENT ||
|
||||||
tcp_sel_write(tcp_conn))
|
tcp_sel_write(tcp_conn))
|
||||||
{
|
{
|
||||||
|
@ -727,6 +745,7 @@ select_res_t select_res;
|
||||||
tcp_fd->tf_put_userdata= put_userdata;
|
tcp_fd->tf_put_userdata= put_userdata;
|
||||||
tcp_fd->tf_select_res= select_res;
|
tcp_fd->tf_select_res= select_res;
|
||||||
tcp_fd->tf_conn= 0;
|
tcp_fd->tf_conn= 0;
|
||||||
|
tcp_fd->tf_error= 0;
|
||||||
for (j= 0; j<TFL_LISTEN_MAX; j++)
|
for (j= 0; j<TFL_LISTEN_MAX; j++)
|
||||||
tcp_fd->tf_listenq[j]= NULL;
|
tcp_fd->tf_listenq[j]= NULL;
|
||||||
return i;
|
return i;
|
||||||
|
@ -766,7 +785,7 @@ ioreq_t req;
|
||||||
switch (req)
|
switch (req)
|
||||||
{
|
{
|
||||||
case NWIOSTCPCONF:
|
case NWIOSTCPCONF:
|
||||||
if ((tcp_fd->tf_flags & TFF_CONNECTEDx) ||
|
if ((tcp_fd->tf_flags & TFF_CONNECTED) ||
|
||||||
(tcp_fd->tf_flags & TFF_CONNECTING) ||
|
(tcp_fd->tf_flags & TFF_CONNECTING) ||
|
||||||
(tcp_fd->tf_flags & TFF_LISTENQ))
|
(tcp_fd->tf_flags & TFF_LISTENQ))
|
||||||
{
|
{
|
||||||
|
@ -783,7 +802,7 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
tcp_conf= (nwio_tcpconf_t *)ptr2acc_data(conf_acc);
|
tcp_conf= (nwio_tcpconf_t *)ptr2acc_data(conf_acc);
|
||||||
|
|
||||||
*tcp_conf= tcp_fd->tf_tcpconf;
|
*tcp_conf= tcp_fd->tf_tcpconf;
|
||||||
if (tcp_fd->tf_flags & TFF_CONNECTEDx)
|
if (tcp_fd->tf_flags & TFF_CONNECTED)
|
||||||
{
|
{
|
||||||
tcp_conn= tcp_fd->tf_conn;
|
tcp_conn= tcp_fd->tf_conn;
|
||||||
tcp_conf->nwtc_locport= tcp_conn->tc_locport;
|
tcp_conf->nwtc_locport= tcp_conn->tc_locport;
|
||||||
|
@ -820,7 +839,7 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
result= NW_OK;
|
result= NW_OK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (tcp_fd->tf_flags & TFF_CONNECTEDx)
|
if (tcp_fd->tf_flags & TFF_CONNECTED)
|
||||||
{
|
{
|
||||||
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
||||||
reply_thr_get (tcp_fd, EISCONN, TRUE);
|
reply_thr_get (tcp_fd, EISCONN, TRUE);
|
||||||
|
@ -833,7 +852,7 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
break;
|
break;
|
||||||
case NWIOTCPLISTEN:
|
case NWIOTCPLISTEN:
|
||||||
case NWIOTCPLISTENQ:
|
case NWIOTCPLISTENQ:
|
||||||
if ((tcp_fd->tf_flags & TFF_CONNECTEDx) ||
|
if ((tcp_fd->tf_flags & TFF_CONNECTED) ||
|
||||||
(tcp_fd->tf_flags & TFF_LISTENQ) ||
|
(tcp_fd->tf_flags & TFF_LISTENQ) ||
|
||||||
(tcp_fd->tf_flags & TFF_CONNECTING))
|
(tcp_fd->tf_flags & TFF_CONNECTING))
|
||||||
{
|
{
|
||||||
|
@ -845,7 +864,7 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
result= tcp_listen(tcp_fd, (req == NWIOTCPLISTENQ));
|
result= tcp_listen(tcp_fd, (req == NWIOTCPLISTENQ));
|
||||||
break;
|
break;
|
||||||
case NWIOTCPSHUTDOWN:
|
case NWIOTCPSHUTDOWN:
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
{
|
{
|
||||||
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
||||||
reply_thr_get (tcp_fd, ENOTCONN, TRUE);
|
reply_thr_get (tcp_fd, ENOTCONN, TRUE);
|
||||||
|
@ -866,7 +885,7 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
result= NW_SUSPEND;
|
result= NW_SUSPEND;
|
||||||
break;
|
break;
|
||||||
case NWIOTCPPUSH:
|
case NWIOTCPPUSH:
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
{
|
{
|
||||||
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
||||||
reply_thr_get (tcp_fd, ENOTCONN, TRUE);
|
reply_thr_get (tcp_fd, ENOTCONN, TRUE);
|
||||||
|
@ -922,6 +941,20 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
|
||||||
result= NW_OK;
|
result= NW_OK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NWIOTCPGERROR:
|
||||||
|
acc= bf_memreq(sizeof(*bytesp));
|
||||||
|
bytesp= (int *)ptr2acc_data(acc);
|
||||||
|
*bytesp= -tcp_fd->tf_error; /* Errors are positive in
|
||||||
|
* user space.
|
||||||
|
*/
|
||||||
|
tcp_fd->tf_error= 0;
|
||||||
|
result= (*tcp_fd->tf_put_userdata)(tcp_fd->tf_srfd,
|
||||||
|
0, acc, TRUE);
|
||||||
|
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
||||||
|
reply_thr_put(tcp_fd, result, TRUE);
|
||||||
|
result= NW_OK;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
|
||||||
reply_thr_get(tcp_fd, EBADIOCTL, TRUE);
|
reply_thr_get(tcp_fd, EBADIOCTL, TRUE);
|
||||||
|
@ -1740,7 +1773,7 @@ size_t count;
|
||||||
|
|
||||||
assert (tcp_fd->tf_flags & TFF_INUSE);
|
assert (tcp_fd->tf_flags & TFF_INUSE);
|
||||||
|
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
{
|
{
|
||||||
reply_thr_get (tcp_fd, ENOTCONN, FALSE);
|
reply_thr_get (tcp_fd, ENOTCONN, FALSE);
|
||||||
return NW_OK;
|
return NW_OK;
|
||||||
|
@ -1794,7 +1827,7 @@ size_t count;
|
||||||
|
|
||||||
assert (tcp_fd->tf_flags & TFF_INUSE);
|
assert (tcp_fd->tf_flags & TFF_INUSE);
|
||||||
|
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
{
|
{
|
||||||
reply_thr_put (tcp_fd, ENOTCONN, FALSE);
|
reply_thr_put (tcp_fd, ENOTCONN, FALSE);
|
||||||
return NW_OK;
|
return NW_OK;
|
||||||
|
@ -1860,10 +1893,11 @@ tcp_conn_t *tcp_conn;
|
||||||
assert(tcp_conn->tc_fd == tcp_fd);
|
assert(tcp_conn->tc_fd == tcp_fd);
|
||||||
tcp_fd->tf_conn= NULL;
|
tcp_fd->tf_conn= NULL;
|
||||||
tcp_conn->tc_fd= NULL;
|
tcp_conn->tc_fd= NULL;
|
||||||
|
tcp_fd->tf_error= reply;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tcp_fd->tf_flags |= TFF_CONNECTEDx;
|
tcp_fd->tf_flags |= TFF_CONNECTED;
|
||||||
reply= NW_OK;
|
reply= NW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2085,7 +2119,7 @@ tcp_fd_t *tcp_fd;
|
||||||
tcp_reply_ioctl(tcp_fd, EBADMODE);
|
tcp_reply_ioctl(tcp_fd, EBADMODE);
|
||||||
return NW_OK;
|
return NW_OK;
|
||||||
}
|
}
|
||||||
assert (!(tcp_fd->tf_flags & TFF_CONNECTEDx) &&
|
assert (!(tcp_fd->tf_flags & TFF_CONNECTED) &&
|
||||||
!(tcp_fd->tf_flags & TFF_CONNECTING) &&
|
!(tcp_fd->tf_flags & TFF_CONNECTING) &&
|
||||||
!(tcp_fd->tf_flags & TFF_LISTENQ));
|
!(tcp_fd->tf_flags & TFF_LISTENQ));
|
||||||
if ((tcp_fd->tf_tcpconf.nwtc_flags & (NWTC_SET_RA|NWTC_SET_RP))
|
if ((tcp_fd->tf_tcpconf.nwtc_flags & (NWTC_SET_RA|NWTC_SET_RP))
|
||||||
|
@ -2206,7 +2240,7 @@ int do_listenq;
|
||||||
reply_thr_get(tcp_fd, EBADMODE, TRUE);
|
reply_thr_get(tcp_fd, EBADMODE, TRUE);
|
||||||
return NW_OK;
|
return NW_OK;
|
||||||
}
|
}
|
||||||
assert (!(tcp_fd->tf_flags & TFF_CONNECTEDx) &&
|
assert (!(tcp_fd->tf_flags & TFF_CONNECTED) &&
|
||||||
!(tcp_fd->tf_flags & TFF_CONNECTING) &&
|
!(tcp_fd->tf_flags & TFF_CONNECTING) &&
|
||||||
!(tcp_fd->tf_flags & TFF_LISTENQ));
|
!(tcp_fd->tf_flags & TFF_LISTENQ));
|
||||||
tcp_conn= tcp_fd->tf_conn;
|
tcp_conn= tcp_fd->tf_conn;
|
||||||
|
@ -2313,7 +2347,7 @@ tcp_fd_t *tcp_fd;
|
||||||
tcp_fd->tf_listenq[i]= NULL;
|
tcp_fd->tf_listenq[i]= NULL;
|
||||||
tcp_conn->tc_fd= dst_fd;
|
tcp_conn->tc_fd= dst_fd;
|
||||||
dst_fd->tf_conn= tcp_conn;
|
dst_fd->tf_conn= tcp_conn;
|
||||||
dst_fd->tf_flags |= TFF_CONNECTEDx;
|
dst_fd->tf_flags |= TFF_CONNECTED;
|
||||||
|
|
||||||
tcp_reply_ioctl(tcp_fd, NW_OK);
|
tcp_reply_ioctl(tcp_fd, NW_OK);
|
||||||
return NW_OK;
|
return NW_OK;
|
||||||
|
|
|
@ -61,6 +61,7 @@ typedef struct tcp_fd
|
||||||
size_t tf_write_count;
|
size_t tf_write_count;
|
||||||
size_t tf_read_offset;
|
size_t tf_read_offset;
|
||||||
size_t tf_read_count;
|
size_t tf_read_count;
|
||||||
|
int tf_error; /* Error for nonblocking connect */
|
||||||
tcp_cookie_t tf_cookie;
|
tcp_cookie_t tf_cookie;
|
||||||
} tcp_fd_t;
|
} tcp_fd_t;
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ typedef struct tcp_fd
|
||||||
#define TFF_IOC_INIT_SP 0x20
|
#define TFF_IOC_INIT_SP 0x20
|
||||||
#define TFF_LISTENQ 0x40
|
#define TFF_LISTENQ 0x40
|
||||||
#define TFF_CONNECTING 0x80
|
#define TFF_CONNECTING 0x80
|
||||||
#define TFF_CONNECTEDx 0x100
|
#define TFF_CONNECTED 0x100
|
||||||
#define TFF_WR_URG 0x200
|
#define TFF_WR_URG 0x200
|
||||||
#define TFF_PUSH_DATA 0x400
|
#define TFF_PUSH_DATA 0x400
|
||||||
#define TFF_RECV_URG 0x800
|
#define TFF_RECV_URG 0x800
|
||||||
|
|
|
@ -1455,7 +1455,7 @@ int *bytesp;
|
||||||
|
|
||||||
*bytesp= 0; /* The default is that nothing is available */
|
*bytesp= 0; /* The default is that nothing is available */
|
||||||
|
|
||||||
if (!(tcp_fd->tf_flags & TFF_CONNECTEDx))
|
if (!(tcp_fd->tf_flags & TFF_CONNECTED))
|
||||||
return;
|
return;
|
||||||
tcp_conn= tcp_fd->tf_conn;
|
tcp_conn= tcp_fd->tf_conn;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue