made SCTP check more strict in sck.c
This commit is contained in:
parent
ff0e0d8c46
commit
8ead6cb086
@ -38,6 +38,9 @@
|
|||||||
|
|
||||||
#if defined(HAVE_NETINET_SCTP_H)
|
#if defined(HAVE_NETINET_SCTP_H)
|
||||||
# include <netinet/sctp.h>
|
# include <netinet/sctp.h>
|
||||||
|
# if defined(IPPROTO_SCTP)
|
||||||
|
# define ENABLE_SCTP
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_NETPACKET_PACKET_H)
|
#if defined(HAVE_NETPACKET_PACKET_H)
|
||||||
@ -255,7 +258,7 @@ static struct sck_type_map_t sck_type_map[] =
|
|||||||
/* HIO_DEV_SCK_UDP6 */
|
/* HIO_DEV_SCK_UDP6 */
|
||||||
{ AF_INET6, SOCK_DGRAM, 0, 0, 0, 0 },
|
{ AF_INET6, SOCK_DGRAM, 0, 0, 0, 0 },
|
||||||
|
|
||||||
#if defined(IPPROTO_SCTP)
|
#if defined(ENABLE_SCTP)
|
||||||
/* HIO_DEV_SCK_SCTP4 */
|
/* HIO_DEV_SCK_SCTP4 */
|
||||||
{ AF_INET, SOCK_STREAM, IPPROTO_SCTP, 1, 1, HIO_DEV_CAP_STREAM },
|
{ AF_INET, SOCK_STREAM, IPPROTO_SCTP, 1, 1, HIO_DEV_CAP_STREAM },
|
||||||
|
|
||||||
@ -412,7 +415,7 @@ static int dev_sck_make (hio_dev_t* dev, void* ctx)
|
|||||||
hnd = open_async_socket(hio, sck_type_map[arg->type].domain, sck_type_map[arg->type].type, sck_type_map[arg->type].proto);
|
hnd = open_async_socket(hio, sck_type_map[arg->type].domain, sck_type_map[arg->type].type, sck_type_map[arg->type].proto);
|
||||||
if (hnd == HIO_SYSHND_INVALID) goto oops;
|
if (hnd == HIO_SYSHND_INVALID) goto oops;
|
||||||
|
|
||||||
#if defined(IPPROTO_SCTP)
|
#if defined(ENABLE_SCTP)
|
||||||
if (sck_type_map[arg->type].type == SOCK_SEQPACKET &&
|
if (sck_type_map[arg->type].type == SOCK_SEQPACKET &&
|
||||||
sck_type_map[arg->type].proto == IPPROTO_SCTP)
|
sck_type_map[arg->type].proto == IPPROTO_SCTP)
|
||||||
{
|
{
|
||||||
@ -633,7 +636,7 @@ static int dev_sck_read_bpf (hio_dev_t* dev, void* buf, hio_iolen_t* len, hio_de
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(IPPROTO_SCTP)
|
#if defined(ENABLE_SCTP)
|
||||||
static int recvmsg_sctp(
|
static int recvmsg_sctp(
|
||||||
int s, void* ptr, hio_oow_t len, struct sockaddr* srcaddr, hio_scklen_t* srcaddrlen,
|
int s, void* ptr, hio_oow_t len, struct sockaddr* srcaddr, hio_scklen_t* srcaddrlen,
|
||||||
struct sctp_sndrcvinfo* sinfo, int* msg_flags)
|
struct sctp_sndrcvinfo* sinfo, int* msg_flags)
|
||||||
@ -996,7 +999,7 @@ static int dev_sck_writev_bpf (hio_dev_t* dev, const hio_iovec_t* iov, hio_iolen
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------ */
|
||||||
#if defined(IPPROTO_SCTP)
|
#if defined(ENABLE_SCTP)
|
||||||
static int dev_sck_write_sctp_sp (hio_dev_t* dev, const void* data, hio_iolen_t* len, const hio_devaddr_t* dstaddr)
|
static int dev_sck_write_sctp_sp (hio_dev_t* dev, const void* data, hio_iolen_t* len, const hio_devaddr_t* dstaddr)
|
||||||
{
|
{
|
||||||
/* NOTE: sctp support is far away from complete */
|
/* NOTE: sctp support is far away from complete */
|
||||||
@ -1619,6 +1622,7 @@ static hio_dev_mth_t dev_mth_sck_stream =
|
|||||||
dev_sck_sendfile_stream,
|
dev_sck_sendfile_stream,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(ENABLE_SCTP)
|
||||||
static hio_dev_mth_t dev_mth_sck_sctp_sp =
|
static hio_dev_mth_t dev_mth_sck_sctp_sp =
|
||||||
{
|
{
|
||||||
dev_sck_make,
|
dev_sck_make,
|
||||||
@ -1633,6 +1637,7 @@ static hio_dev_mth_t dev_mth_sck_sctp_sp =
|
|||||||
dev_sck_writev_sctp_sp,
|
dev_sck_writev_sctp_sp,
|
||||||
HIO_NULL, /* sendfile */
|
HIO_NULL, /* sendfile */
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static hio_dev_mth_t dev_mth_clisck_stateless =
|
static hio_dev_mth_t dev_mth_clisck_stateless =
|
||||||
{
|
{
|
||||||
@ -1664,6 +1669,7 @@ static hio_dev_mth_t dev_mth_clisck_stream =
|
|||||||
dev_sck_sendfile_stream
|
dev_sck_sendfile_stream
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(ENABLE_SCTP)
|
||||||
static hio_dev_mth_t dev_mth_clisck_sctp_sp =
|
static hio_dev_mth_t dev_mth_clisck_sctp_sp =
|
||||||
{
|
{
|
||||||
dev_sck_make_client,
|
dev_sck_make_client,
|
||||||
@ -1678,6 +1684,7 @@ static hio_dev_mth_t dev_mth_clisck_sctp_sp =
|
|||||||
dev_sck_writev_sctp_sp,
|
dev_sck_writev_sctp_sp,
|
||||||
HIO_NULL,
|
HIO_NULL,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static hio_dev_mth_t dev_mth_sck_bpf =
|
static hio_dev_mth_t dev_mth_sck_bpf =
|
||||||
{
|
{
|
||||||
@ -1814,8 +1821,12 @@ static int make_accepted_client_connection (hio_dev_sck_t* rdev, hio_syshnd_t cl
|
|||||||
* choose the client socket method base on the master socket
|
* choose the client socket method base on the master socket
|
||||||
* device capability. currently, stream or non-stream is supported.
|
* device capability. currently, stream or non-stream is supported.
|
||||||
*/
|
*/
|
||||||
|
#if defined(ENABLE_SCTP)
|
||||||
dev_mth = (sck_type_map[clisck_type].extra_dev_cap & HIO_DEV_CAP_STREAM)? &dev_mth_clisck_stream:
|
dev_mth = (sck_type_map[clisck_type].extra_dev_cap & HIO_DEV_CAP_STREAM)? &dev_mth_clisck_stream:
|
||||||
(sck_type_map[clisck_type].proto == IPPROTO_SCTP)? &dev_mth_clisck_sctp_sp: &dev_mth_clisck_stateless;
|
(sck_type_map[clisck_type].proto == IPPROTO_SCTP)? &dev_mth_clisck_sctp_sp: &dev_mth_clisck_stateless;
|
||||||
|
#else
|
||||||
|
dev_mth = (sck_type_map[clisck_type].extra_dev_cap & HIO_DEV_CAP_STREAM)? &dev_mth_clisck_stream: &dev_mth_clisck_stateless;
|
||||||
|
#endif
|
||||||
clidev = (hio_dev_sck_t*)hio_dev_make(hio, rdev->dev_size, dev_mth, rdev->dev_evcb, &clisck);
|
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))
|
||||||
{
|
{
|
||||||
@ -2393,12 +2404,14 @@ 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_stream, &dev_sck_event_callbacks_stream, (void*)info);
|
&dev_mth_sck_stream, &dev_sck_event_callbacks_stream, (void*)info);
|
||||||
}
|
}
|
||||||
|
#if defined(ENABLE_SCTP)
|
||||||
else if (sck_type_map[info->type].proto == IPPROTO_SCTP)
|
else if (sck_type_map[info->type].proto == IPPROTO_SCTP)
|
||||||
{
|
{
|
||||||
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_sctp_sp, &dev_sck_event_callbacks_sctp_sp, (void*)info);
|
&dev_mth_sck_sctp_sp, &dev_sck_event_callbacks_sctp_sp, (void*)info);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rdev = (hio_dev_sck_t*)hio_dev_make(
|
rdev = (hio_dev_sck_t*)hio_dev_make(
|
||||||
|
Loading…
Reference in New Issue
Block a user