enhanced how to create a socket device over an accepted connection
This commit is contained in:
parent
e74a5554f2
commit
807eb3e74c
@ -218,7 +218,7 @@ static HIO_INLINE hio_skad_t* devaddr_to_skad (hio_dev_sck_t* dev, const hio_dev
|
|||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
#define IS_STATEFUL(sck) ((sck)->dev_cap & HIO_DEV_CAP_STREAM)
|
#define IS_STREAM(sck) ((sck)->dev_cap & HIO_DEV_CAP_STREAM)
|
||||||
|
|
||||||
struct sck_type_map_t
|
struct sck_type_map_t
|
||||||
{
|
{
|
||||||
@ -321,7 +321,7 @@ static void connect_timedout (hio_t* hio, const hio_ntime_t* now, hio_tmrjob_t*
|
|||||||
{
|
{
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
||||||
|
|
||||||
HIO_ASSERT (hio, IS_STATEFUL(rdev));
|
HIO_ASSERT (hio, IS_STREAM(rdev));
|
||||||
|
|
||||||
if (rdev->state & HIO_DEV_SCK_CONNECTING)
|
if (rdev->state & HIO_DEV_SCK_CONNECTING)
|
||||||
{
|
{
|
||||||
@ -339,7 +339,7 @@ static void ssl_accept_timedout (hio_t* hio, const hio_ntime_t* now, hio_tmrjob_
|
|||||||
{
|
{
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
||||||
|
|
||||||
HIO_ASSERT (hio, IS_STATEFUL(rdev));
|
HIO_ASSERT (hio, IS_STREAM(rdev));
|
||||||
|
|
||||||
if (rdev->state & HIO_DEV_SCK_ACCEPTING_SSL)
|
if (rdev->state & HIO_DEV_SCK_ACCEPTING_SSL)
|
||||||
{
|
{
|
||||||
@ -352,7 +352,7 @@ static void ssl_connect_timedout (hio_t* hio, const hio_ntime_t* now, hio_tmrjob
|
|||||||
{
|
{
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)job->ctx;
|
||||||
|
|
||||||
HIO_ASSERT (hio, IS_STATEFUL(rdev));
|
HIO_ASSERT (hio, IS_STREAM(rdev));
|
||||||
|
|
||||||
if (rdev->state & HIO_DEV_SCK_CONNECTING_SSL)
|
if (rdev->state & HIO_DEV_SCK_CONNECTING_SSL)
|
||||||
{
|
{
|
||||||
@ -519,7 +519,7 @@ static int dev_sck_kill (hio_dev_t* dev, int force)
|
|||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
|
|
||||||
if (IS_STATEFUL(rdev))
|
if (IS_STREAM(rdev))
|
||||||
{
|
{
|
||||||
/*if (HIO_DEV_SCK_GET_PROGRESS(rdev))
|
/*if (HIO_DEV_SCK_GET_PROGRESS(rdev))
|
||||||
{*/
|
{*/
|
||||||
@ -578,7 +578,7 @@ static hio_syshnd_t dev_sck_getsyshnd (hio_dev_t* dev)
|
|||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int dev_sck_read_stateful (hio_dev_t* dev, void* buf, hio_iolen_t* len, hio_devaddr_t* srcaddr)
|
static int dev_sck_read_stream (hio_dev_t* dev, void* buf, hio_iolen_t* len, hio_devaddr_t* srcaddr)
|
||||||
{
|
{
|
||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
@ -706,7 +706,7 @@ struct sctp_sndrcvinfo {
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int dev_sck_write_stateful (hio_dev_t* dev, const void* data, hio_iolen_t* len, const hio_devaddr_t* dstaddr)
|
static int dev_sck_write_stream (hio_dev_t* dev, const void* data, hio_iolen_t* len, const hio_devaddr_t* dstaddr)
|
||||||
{
|
{
|
||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
@ -782,7 +782,7 @@ static int dev_sck_write_stateful (hio_dev_t* dev, const void* data, hio_iolen_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dev_sck_writev_stateful (hio_dev_t* dev, const hio_iovec_t* iov, hio_iolen_t* iovcnt, const hio_devaddr_t* dstaddr)
|
static int dev_sck_writev_stream (hio_dev_t* dev, const hio_iovec_t* iov, hio_iolen_t* iovcnt, const hio_devaddr_t* dstaddr)
|
||||||
{
|
{
|
||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
@ -809,7 +809,7 @@ static int dev_sck_writev_stateful (hio_dev_t* dev, const hio_iovec_t* iov, hio_
|
|||||||
for (i = 0; i < *iovcnt; i++)
|
for (i = 0; i < *iovcnt; i++)
|
||||||
{
|
{
|
||||||
/* no SSL_writev. invoke multiple calls to SSL_write().
|
/* no SSL_writev. invoke multiple calls to SSL_write().
|
||||||
* since the write function is for the stateful connection,
|
* since the write function is for the stream connection,
|
||||||
* mutiple calls shouldn't really matter */
|
* mutiple calls shouldn't really matter */
|
||||||
x = SSL_write((SSL*)rdev->ssl, iov[i].iov_ptr, iov[i].iov_len);
|
x = SSL_write((SSL*)rdev->ssl, iov[i].iov_ptr, iov[i].iov_len);
|
||||||
if (x <= -1)
|
if (x <= -1)
|
||||||
@ -990,7 +990,7 @@ static int dev_sck_writev_sctp_sp (hio_dev_t* dev, const hio_iovec_t* iov, hio_i
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int dev_sck_sendfile_stateful (hio_dev_t* dev, hio_syshnd_t in_fd, hio_foff_t foff, hio_iolen_t* len)
|
static int dev_sck_sendfile_stream (hio_dev_t* dev, hio_syshnd_t in_fd, hio_foff_t foff, hio_iolen_t* len)
|
||||||
{
|
{
|
||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
@ -1540,7 +1540,7 @@ static hio_dev_mth_t dev_mth_sck_stateless =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static hio_dev_mth_t dev_mth_sck_stateful =
|
static hio_dev_mth_t dev_mth_sck_stream =
|
||||||
{
|
{
|
||||||
dev_sck_make,
|
dev_sck_make,
|
||||||
dev_sck_kill,
|
dev_sck_kill,
|
||||||
@ -1548,14 +1548,14 @@ static hio_dev_mth_t dev_mth_sck_stateful =
|
|||||||
dev_sck_getsyshnd,
|
dev_sck_getsyshnd,
|
||||||
HIO_NULL,
|
HIO_NULL,
|
||||||
|
|
||||||
dev_sck_read_stateful,
|
dev_sck_read_stream,
|
||||||
dev_sck_write_stateful,
|
dev_sck_write_stream,
|
||||||
dev_sck_writev_stateful,
|
dev_sck_writev_stream,
|
||||||
dev_sck_sendfile_stateful,
|
dev_sck_sendfile_stream,
|
||||||
dev_sck_ioctl, /* ioctl */
|
dev_sck_ioctl, /* ioctl */
|
||||||
};
|
};
|
||||||
|
|
||||||
static hio_dev_mth_t dev_mth_clisck =
|
static hio_dev_mth_t dev_mth_clisck_stateless =
|
||||||
{
|
{
|
||||||
dev_sck_make_client,
|
dev_sck_make_client,
|
||||||
dev_sck_kill,
|
dev_sck_kill,
|
||||||
@ -1563,10 +1563,25 @@ static hio_dev_mth_t dev_mth_clisck =
|
|||||||
dev_sck_getsyshnd,
|
dev_sck_getsyshnd,
|
||||||
HIO_NULL,
|
HIO_NULL,
|
||||||
|
|
||||||
dev_sck_read_stateful,
|
dev_sck_read_stateless,
|
||||||
dev_sck_write_stateful,
|
dev_sck_write_stateless,
|
||||||
dev_sck_writev_stateful,
|
dev_sck_writev_stateless,
|
||||||
dev_sck_sendfile_stateful,
|
HIO_NULL,
|
||||||
|
dev_sck_ioctl
|
||||||
|
};
|
||||||
|
|
||||||
|
static hio_dev_mth_t dev_mth_clisck_stream =
|
||||||
|
{
|
||||||
|
dev_sck_make_client,
|
||||||
|
dev_sck_kill,
|
||||||
|
dev_sck_fail_before_make_client,
|
||||||
|
dev_sck_getsyshnd,
|
||||||
|
HIO_NULL,
|
||||||
|
|
||||||
|
dev_sck_read_stream,
|
||||||
|
dev_sck_write_stream,
|
||||||
|
dev_sck_writev_stream,
|
||||||
|
dev_sck_sendfile_stream,
|
||||||
dev_sck_ioctl
|
dev_sck_ioctl
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1685,6 +1700,7 @@ static int make_accepted_client_connection (hio_dev_sck_t* rdev, hio_syshnd_t cl
|
|||||||
hio_t* hio = rdev->hio;
|
hio_t* hio = rdev->hio;
|
||||||
hio_dev_sck_t* clidev;
|
hio_dev_sck_t* clidev;
|
||||||
hio_scklen_t addrlen;
|
hio_scklen_t addrlen;
|
||||||
|
hio_dev_mth_t* dev_mth;
|
||||||
|
|
||||||
if (rdev->on_raw_accept)
|
if (rdev->on_raw_accept)
|
||||||
{
|
{
|
||||||
@ -1699,7 +1715,8 @@ static int make_accepted_client_connection (hio_dev_sck_t* rdev, hio_syshnd_t cl
|
|||||||
* instead of HIO_SIZEOF(hio_dev_sck_t). therefore, the
|
* instead of HIO_SIZEOF(hio_dev_sck_t). therefore, the
|
||||||
* extension area as big as that of the master sck device
|
* extension area as big as that of the master sck device
|
||||||
* is created in the client sck device */
|
* is created in the client sck device */
|
||||||
clidev = (hio_dev_sck_t*)hio_dev_make(hio, rdev->dev_size, &dev_mth_clisck, rdev->dev_evcb, &clisck);
|
dev_mth = (sck_type_map[clisck_type].extra_dev_cap & HIO_DEV_CAP_STREAM)? &dev_mth_clisck_stream: &dev_mth_clisck_stateless;
|
||||||
|
clidev = (hio_dev_sck_t*)hio_dev_make(hio, rdev->dev_size, dev_mth, rdev->dev_evcb, &clisck);
|
||||||
if (HIO_UNLIKELY(!clidev))
|
if (HIO_UNLIKELY(!clidev))
|
||||||
{
|
{
|
||||||
/* [NOTE] 'clisck' is closed by callback methods called by hio_dev_make() upon failure */
|
/* [NOTE] 'clisck' is closed by callback methods called by hio_dev_make() upon failure */
|
||||||
@ -1854,7 +1871,7 @@ accept_done:
|
|||||||
return make_accepted_client_connection(rdev, clisck, &remoteaddr, rdev->type);
|
return make_accepted_client_connection(rdev, clisck, &remoteaddr, rdev->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dev_evcb_sck_ready_stateful (hio_dev_t* dev, int events)
|
static int dev_evcb_sck_ready_stream (hio_dev_t* dev, int events)
|
||||||
{
|
{
|
||||||
hio_t* hio = dev->hio;
|
hio_t* hio = dev->hio;
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
@ -2072,13 +2089,13 @@ static int dev_evcb_sck_ready_stateless (hio_dev_t* dev, int events)
|
|||||||
return 1; /* the device is ok. carry on reading or writing */
|
return 1; /* the device is ok. carry on reading or writing */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dev_evcb_sck_on_read_stateful (hio_dev_t* dev, const void* data, hio_iolen_t dlen, const hio_devaddr_t* srcaddr)
|
static int dev_evcb_sck_on_read_stream (hio_dev_t* dev, const void* data, hio_iolen_t dlen, const hio_devaddr_t* srcaddr)
|
||||||
{
|
{
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
return rdev->on_read(rdev, data, dlen, HIO_NULL);
|
return rdev->on_read(rdev, data, dlen, HIO_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dev_evcb_sck_on_write_stateful (hio_dev_t* dev, hio_iolen_t wrlen, void* wrctx, const hio_devaddr_t* dstaddr)
|
static int dev_evcb_sck_on_write_stream (hio_dev_t* dev, hio_iolen_t wrlen, void* wrctx, const hio_devaddr_t* dstaddr)
|
||||||
{
|
{
|
||||||
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
hio_dev_sck_t* rdev = (hio_dev_sck_t*)dev;
|
||||||
return rdev->on_write(rdev, wrlen, wrctx, HIO_NULL);
|
return rdev->on_write(rdev, wrlen, wrctx, HIO_NULL);
|
||||||
@ -2098,11 +2115,11 @@ static int dev_evcb_sck_on_write_stateless (hio_dev_t* dev, hio_iolen_t wrlen, v
|
|||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
static hio_dev_evcb_t dev_sck_event_callbacks_stateful =
|
static hio_dev_evcb_t dev_sck_event_callbacks_stream =
|
||||||
{
|
{
|
||||||
dev_evcb_sck_ready_stateful,
|
dev_evcb_sck_ready_stream,
|
||||||
dev_evcb_sck_on_read_stateful,
|
dev_evcb_sck_on_read_stream,
|
||||||
dev_evcb_sck_on_write_stateful
|
dev_evcb_sck_on_write_stream
|
||||||
};
|
};
|
||||||
|
|
||||||
static hio_dev_evcb_t dev_sck_event_callbacks_stateless =
|
static hio_dev_evcb_t dev_sck_event_callbacks_stateless =
|
||||||
@ -2263,11 +2280,11 @@ hio_dev_sck_t* hio_dev_sck_make (hio_t* hio, hio_oow_t xtnsize, const hio_dev_sc
|
|||||||
hio, HIO_SIZEOF(hio_dev_sck_t) + xtnsize,
|
hio, HIO_SIZEOF(hio_dev_sck_t) + xtnsize,
|
||||||
&dev_mth_sck_bpf, &dev_sck_event_callbacks_bpf, (void*)info);
|
&dev_mth_sck_bpf, &dev_sck_event_callbacks_bpf, (void*)info);
|
||||||
}
|
}
|
||||||
else if (sck_type_map[info->type].extra_dev_cap & HIO_DEV_CAP_STREAM) /* can't use the IS_STATEFUL() macro yet */
|
else if (sck_type_map[info->type].extra_dev_cap & HIO_DEV_CAP_STREAM) /* can't use the IS_STREAM() macro yet */
|
||||||
{
|
{
|
||||||
rdev = (hio_dev_sck_t*)hio_dev_make(
|
rdev = (hio_dev_sck_t*)hio_dev_make(
|
||||||
hio, HIO_SIZEOF(hio_dev_sck_t) + xtnsize,
|
hio, HIO_SIZEOF(hio_dev_sck_t) + xtnsize,
|
||||||
&dev_mth_sck_stateful, &dev_sck_event_callbacks_stateful, (void*)info);
|
&dev_mth_sck_stream, &dev_sck_event_callbacks_stream, (void*)info);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user