touched up socket related code more
This commit is contained in:
parent
f0320a2ab7
commit
116b90fb74
@ -93,7 +93,7 @@ struct tcp_server_t
|
||||
};
|
||||
typedef struct tcp_server_t tcp_server_t;
|
||||
|
||||
static void tcp_on_disconnect (stio_dev_tcp_t* tcp)
|
||||
static void tcp_on_disconnect (stio_dev_sck_t* tcp)
|
||||
{
|
||||
if (tcp->state & STIO_DEV_TCP_CONNECTING)
|
||||
{
|
||||
@ -116,7 +116,7 @@ static void tcp_on_disconnect (stio_dev_tcp_t* tcp)
|
||||
printf ("TCP DISCONNECTED - THIS MUST NOT HAPPEN (%d - %x)\n", (int)tcp->sck, (unsigned int)tcp->state);
|
||||
}
|
||||
}
|
||||
static int tcp_on_connect (stio_dev_tcp_t* tcp)
|
||||
static int tcp_on_connect (stio_dev_sck_t* tcp)
|
||||
{
|
||||
|
||||
if (tcp->state & STIO_DEV_TCP_CONNECTED)
|
||||
@ -128,18 +128,17 @@ printf ("device connected to a remote server... .asdfjkasdfkljasdlfkjasdj...\n")
|
||||
printf ("device accepted client device... .asdfjkasdfkljasdlfkjasdj...\n");
|
||||
}
|
||||
|
||||
return stio_dev_tcp_write (tcp, "hello", 5, STIO_NULL);
|
||||
return stio_dev_sck_write (tcp, "hello", 5, STIO_NULL, STIO_NULL);
|
||||
}
|
||||
|
||||
|
||||
static int tcp_on_write (stio_dev_tcp_t* tcp, stio_len_t wrlen, void* wrctx)
|
||||
static int tcp_on_write (stio_dev_sck_t* tcp, stio_len_t wrlen, void* wrctx, const stio_sckadr_t* dstadr)
|
||||
{
|
||||
tcp_server_t* ts;
|
||||
|
||||
if (wrlen <= -1)
|
||||
{
|
||||
printf ("SEDING TIMED OUT...........\n");
|
||||
stio_dev_tcp_halt(tcp);
|
||||
stio_dev_sck_halt(tcp);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -147,21 +146,21 @@ else
|
||||
printf (">>> SENT MESSAGE %d of length %ld\n", ts->tally, (long int)wrlen);
|
||||
|
||||
ts->tally++;
|
||||
// if (ts->tally >= 2) stio_dev_tcp_halt (tcp);
|
||||
// if (ts->tally >= 2) stio_dev_sck_halt (tcp);
|
||||
|
||||
printf ("ENABLING READING..............................\n");
|
||||
stio_dev_tcp_read (tcp, 1);
|
||||
stio_dev_sck_read (tcp, 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tcp_on_read (stio_dev_tcp_t* tcp, const void* buf, stio_len_t len)
|
||||
static int tcp_on_read (stio_dev_sck_t* tcp, const void* buf, stio_len_t len, const stio_sckadr_t* srcadr)
|
||||
{
|
||||
if (len <= 0)
|
||||
{
|
||||
printf ("STREAM DEVICE: EOF RECEIVED...\n");
|
||||
/* no outstanding request. but EOF */
|
||||
stio_dev_tcp_halt (tcp);
|
||||
stio_dev_sck_halt (tcp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -172,19 +171,19 @@ int n;
|
||||
static char a ='A';
|
||||
char* xxx = malloc (1000000);
|
||||
memset (xxx, a++ ,1000000);
|
||||
//return stio_dev_tcp_write (tcp, "HELLO", 5, STIO_NULL);
|
||||
//return stio_dev_sck_write (tcp, "HELLO", 5, STIO_NULL);
|
||||
stio_inittime (&tmout, 1, 0);
|
||||
n = stio_dev_tcp_timedwrite (tcp, xxx, 1000000, &tmout, STIO_NULL);
|
||||
n = stio_dev_sck_timedwrite (tcp, xxx, 1000000, &tmout, STIO_NULL, STIO_NULL);
|
||||
free (xxx);
|
||||
|
||||
if (n <= -1) return -1;
|
||||
|
||||
/* post the write finisher */
|
||||
n = stio_dev_tcp_write (tcp, STIO_NULL, 0, STIO_NULL);
|
||||
n = stio_dev_sck_write (tcp, STIO_NULL, 0, STIO_NULL, STIO_NULL);
|
||||
if (n <= -1) return -1;
|
||||
|
||||
printf ("DISABLING READING..............................\n");
|
||||
stio_dev_tcp_read (tcp, 0);
|
||||
stio_dev_sck_read (tcp, 0);
|
||||
return 0;
|
||||
|
||||
/* return 1; let the main loop to read more greedily without consulting the multiplexer */
|
||||
@ -192,14 +191,15 @@ printf ("DISABLING READING..............................\n");
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static int arp_sck_on_read (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, const stio_adr_t* srcadr)
|
||||
static int arp_sck_on_read (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, const stio_sckadr_t* srcadr)
|
||||
{
|
||||
stio_etharp_pkt_t* eap;
|
||||
struct sockaddr_ll* sll = (struct sockaddr_ll*)srcadr;
|
||||
|
||||
if (dlen < STIO_SIZEOF(*eap)) return 0; /* drop */
|
||||
|
||||
eap = (stio_etharp_pkt_t*)data;
|
||||
printf ("ARP OPCODE: %d", ntohs(eap->arphdr.opcode));
|
||||
printf ("ARP ON IFINDEX %d OPCODE: %d", sll->sll_ifindex, ntohs(eap->arphdr.opcode));
|
||||
printf (" SHA: %02X:%02X:%02X:%02X:%02X:%02X", eap->arppld.sha[0], eap->arppld.sha[1], eap->arppld.sha[2], eap->arppld.sha[3], eap->arppld.sha[4], eap->arppld.sha[5]);
|
||||
printf (" SPA: %d.%d.%d.%d", eap->arppld.spa[0], eap->arppld.spa[1], eap->arppld.spa[2], eap->arppld.spa[3]);
|
||||
printf (" THA: %02X:%02X:%02X:%02X:%02X:%02X", eap->arppld.tha[0], eap->arppld.tha[1], eap->arppld.tha[2], eap->arppld.tha[3], eap->arppld.tha[4], eap->arppld.tha[5]);
|
||||
@ -227,14 +227,15 @@ int main ()
|
||||
{
|
||||
|
||||
stio_t* stio;
|
||||
stio_dev_udp_t* udp;
|
||||
stio_dev_sck_t* sck;
|
||||
stio_dev_tcp_t* tcp[2];
|
||||
stio_dev_sck_t* tcp[2];
|
||||
struct sockaddr_in sin;
|
||||
struct sigaction sigact;
|
||||
stio_dev_tcp_connect_t tcp_conn;
|
||||
stio_dev_tcp_listen_t tcp_lstn;
|
||||
stio_dev_tcp_make_t tcp_make;
|
||||
stio_dev_sck_connect_t tcp_conn;
|
||||
stio_dev_sck_listen_t tcp_lstn;
|
||||
stio_dev_sck_bind_t tcp_bind;
|
||||
stio_dev_sck_make_t tcp_make;
|
||||
|
||||
stio_dev_sck_make_t sck_make;
|
||||
tcp_server_t* ts;
|
||||
|
||||
@ -268,13 +269,11 @@ int main ()
|
||||
}
|
||||
*/
|
||||
|
||||
memset (&sin, 0, STIO_SIZEOF(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
memset (&tcp_make, 0, STIO_SIZEOF(&tcp_make));
|
||||
memcpy (&tcp_make.addr, &sin, STIO_SIZEOF(sin));
|
||||
tcp_make.type = STIO_DEV_SCK_TCP4;
|
||||
tcp_make.on_write = tcp_on_write;
|
||||
tcp_make.on_read = tcp_on_read;
|
||||
tcp[0] = stio_dev_tcp_make (stio, STIO_SIZEOF(tcp_server_t), &tcp_make);
|
||||
tcp[0] = stio_dev_sck_make (stio, STIO_SIZEOF(tcp_server_t), &tcp_make);
|
||||
if (!tcp[0])
|
||||
{
|
||||
printf ("Cannot make tcp\n");
|
||||
@ -287,7 +286,7 @@ int main ()
|
||||
memset (&sin, 0, STIO_SIZEOF(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(9999);
|
||||
inet_pton (sin.sin_family, "192.168.1.4", &sin.sin_addr);
|
||||
inet_pton (sin.sin_family, "192.168.1.119", &sin.sin_addr);
|
||||
//inet_pton (sin.sin_family, "127.0.0.1", &sin.sin_addr);
|
||||
|
||||
memset (&tcp_conn, 0, STIO_SIZEOF(tcp_conn));
|
||||
@ -295,21 +294,17 @@ int main ()
|
||||
tcp_conn.tmout.sec = 5;
|
||||
tcp_conn.on_connect = tcp_on_connect;
|
||||
tcp_conn.on_disconnect = tcp_on_disconnect;
|
||||
if (stio_dev_tcp_connect (tcp[0], &tcp_conn) <= -1)
|
||||
if (stio_dev_sck_connect (tcp[0], &tcp_conn) <= -1)
|
||||
{
|
||||
printf ("stio_dev_tcp_connect() failed....\n");
|
||||
printf ("stio_dev_sck_connect() failed....\n");
|
||||
goto oops;
|
||||
}
|
||||
|
||||
memset (&sin, 0, STIO_SIZEOF(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons(1234);
|
||||
memset (&tcp_make, 0, STIO_SIZEOF(&tcp_make));
|
||||
memcpy (&tcp_make.addr, &sin, STIO_SIZEOF(sin));
|
||||
tcp_make.on_write = tcp_on_write;
|
||||
tcp_make.on_read = tcp_on_read;
|
||||
|
||||
tcp[1] = stio_dev_tcp_make (stio, STIO_SIZEOF(tcp_server_t), &tcp_make);
|
||||
tcp[1] = stio_dev_sck_make (stio, STIO_SIZEOF(tcp_server_t), &tcp_make);
|
||||
if (!tcp[1])
|
||||
{
|
||||
printf ("Cannot make tcp\n");
|
||||
@ -318,12 +313,23 @@ int main ()
|
||||
ts = (tcp_server_t*)(tcp[1] + 1);
|
||||
ts->tally = 0;
|
||||
|
||||
memset (&tcp_bind, 0, STIO_SIZEOF(tcp_bind));
|
||||
//memcpy (&tcp_bind.addr, &sin, STIO_SIZEOF(sin));
|
||||
((struct sockaddr_in*)&tcp_bind.addr)->sin_family = AF_INET;
|
||||
((struct sockaddr_in*)&tcp_bind.addr)->sin_port = htons(1234);
|
||||
|
||||
if (stio_dev_sck_bind (tcp[1],&tcp_bind) <= -1)
|
||||
{
|
||||
printf ("stio_dev_sck_bind() failed....\n");
|
||||
goto oops;
|
||||
}
|
||||
|
||||
tcp_lstn.backlogs = 100;
|
||||
tcp_lstn.on_connect = tcp_on_connect;
|
||||
tcp_lstn.on_disconnect = tcp_on_disconnect;
|
||||
if (stio_dev_tcp_listen (tcp[1], &tcp_lstn) <= -1)
|
||||
if (stio_dev_sck_listen (tcp[1], &tcp_lstn) <= -1)
|
||||
{
|
||||
printf ("stio_dev_tcp_listen() failed....\n");
|
||||
printf ("stio_dev_sck_listen() failed....\n");
|
||||
goto oops;
|
||||
}
|
||||
|
||||
@ -344,11 +350,8 @@ int main ()
|
||||
{
|
||||
stio_etharp_pkt_t etharp;
|
||||
struct sockaddr_ll sll;
|
||||
stio_adr_t adr;
|
||||
|
||||
memset (&sll, 0, sizeof(sll));
|
||||
adr.ptr = &sll;
|
||||
adr.len = sizeof(sll);
|
||||
sll.sll_family = AF_PACKET;
|
||||
// sll.sll_protocol = STIO_CONST_HTON16(STIO_ETHHDR_PROTO_ARP);
|
||||
// sll.sll_hatype = STIO_CONST_HTON16(STIO_ARPHDR_HTYPE_ETH);
|
||||
@ -359,7 +362,6 @@ int main ()
|
||||
/* if unicast ... */
|
||||
//sll.sll_pkttype = PACKET_OTHERHOST;
|
||||
// sll.sll_pkttype = PACKET_BROADCAST;
|
||||
|
||||
memset (ðarp, 0, sizeof(etharp));
|
||||
|
||||
memcpy (etharp.ethhdr.source, "\xB8\x6B\x23\x9C\x10\x76", STIO_ETHADR_LEN);
|
||||
@ -374,7 +376,7 @@ int main ()
|
||||
|
||||
memcpy (etharp.arppld.sha, "\xB8\x6B\x23\x9C\x10\x76", STIO_ETHADR_LEN);
|
||||
|
||||
if (stio_dev_sck_write (sck, ðarp, sizeof(etharp), NULL, &adr) <= -1)
|
||||
if (stio_dev_sck_write (sck, ðarp, sizeof(etharp), NULL, &sll) <= -1)
|
||||
//if (stio_dev_sck_write (sck, ðarp.arphdr, sizeof(etharp) - sizeof(etharp.ethhdr), NULL, &adr) <= -1)
|
||||
{
|
||||
printf ("CANNOT WRITE ARP...\n");
|
||||
|
@ -41,9 +41,31 @@
|
||||
|
||||
#define STIO_ETHADR_LEN 6
|
||||
#define STIO_IP4ADR_LEN 4
|
||||
#define STIO_IP6ADR_LEN 16
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(1)
|
||||
|
||||
|
||||
struct stio_ethadr_t
|
||||
{
|
||||
stio_uint8_t v[STIO_ETHADR_LEN];
|
||||
};
|
||||
typedef struct stio_ethadr_t stio_ethadr_t;
|
||||
|
||||
struct stio_ip4adr_t
|
||||
{
|
||||
stio_uint8_t v[STIO_IP4ADR_LEN];
|
||||
};
|
||||
typedef struct stio_ip4adr_t stio_ip4adr_t;
|
||||
|
||||
struct stio_ip6adr_t
|
||||
{
|
||||
stio_uint8_t v[STIO_IP6ADR_LEN];
|
||||
};
|
||||
typedef struct stio_ip6adr_t stio_ip6adr_t;
|
||||
|
||||
|
||||
struct stio_ethhdr_t
|
||||
{
|
||||
stio_uint8_t dest[STIO_ETHADR_LEN];
|
||||
|
@ -205,13 +205,13 @@ printf ("PRO READY...%p\n", dev);
|
||||
return 1; /* the device is ok. carry on reading or writing */
|
||||
}
|
||||
|
||||
static int pro_on_read (stio_dev_t* dev, const void* data, stio_len_t len, const stio_adr_t* srcadr)
|
||||
static int pro_on_read (stio_dev_t* dev, const void* data, stio_len_t len, const stio_devadr_t* srcadr)
|
||||
{
|
||||
stio_dev_pro_t* pro = (stio_dev_pro_t*)dev;
|
||||
return pro->on_read (pro, data, len);
|
||||
}
|
||||
|
||||
static int pro_on_write (stio_dev_t* dev, void* wrctx, const stio_adr_t* dstadr)
|
||||
static int pro_on_write (stio_dev_t* dev, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
stio_dev_pro_t* pro = (stio_dev_pro_t*)dev;
|
||||
return pro->on_write (pro, wrctx);
|
||||
|
@ -32,8 +32,10 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netpacket/packet.h>
|
||||
|
||||
/* ========================================================================= */
|
||||
void stio_closeasyncsck (stio_t* stio, stio_sckhnd_t sck)
|
||||
@ -92,24 +94,80 @@ int stio_getsckadrinfo (stio_t* stio, const stio_sckadr_t* addr, stio_scklen_t*
|
||||
{
|
||||
struct sockaddr* saddr = (struct sockaddr*)addr;
|
||||
|
||||
if (saddr->sa_family == AF_INET)
|
||||
switch (saddr->sa_family)
|
||||
{
|
||||
if (len) *len = STIO_SIZEOF(struct sockaddr_in);
|
||||
if (family) *family = AF_INET;
|
||||
return 0;
|
||||
}
|
||||
else if (saddr->sa_family == AF_INET6)
|
||||
{
|
||||
if (len) *len = STIO_SIZEOF(struct sockaddr_in6);
|
||||
if (family) *family = AF_INET6;
|
||||
return 0;
|
||||
case AF_INET:
|
||||
if (len) *len = STIO_SIZEOF(struct sockaddr_in);
|
||||
if (family) *family = AF_INET;
|
||||
return 0;
|
||||
|
||||
case AF_INET6:
|
||||
if (len) *len = STIO_SIZEOF(struct sockaddr_in6);
|
||||
if (family) *family = AF_INET6;
|
||||
return 0;
|
||||
|
||||
case AF_PACKET:
|
||||
if (len) *len = STIO_SIZEOF(struct sockaddr_ll);
|
||||
if (family) *family = AF_INET6;
|
||||
return 0;
|
||||
}
|
||||
|
||||
stio->errnum = STIO_EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void stio_initsckadrforip4 (stio_sckadr_t* sckadr, stio_uint16_t port, stio_ip4adr_t* ip4adr)
|
||||
{
|
||||
struct sockaddr_in* sin = (struct sockaddr_in*)sckadr;
|
||||
|
||||
STIO_MEMSET (sin, 0, STIO_SIZEOF(*sin));
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_port = htons(port);
|
||||
STIO_MEMSET (&sin->sin_addr, ip4adr, STIO_IP4ADR_LEN);
|
||||
}
|
||||
|
||||
static void stio_initsckadrforip6 (stio_sckadr_t* sckadr, stio_uint16_t port, stio_ip6adr_t* ip6adr)
|
||||
{
|
||||
struct sockaddr_in6* sin = (struct sockaddr_in6*)sckadr;
|
||||
|
||||
/* TODO: include sin6_scope_id */
|
||||
STIO_MEMSET (sin, 0, STIO_SIZEOF(*sin));
|
||||
sin->sin6_family = AF_INET;
|
||||
sin->sin6_port = htons(port);
|
||||
STIO_MEMSET (&sin->sin_addr, ip6adr, STIO_IP6ADR_LEN);
|
||||
}
|
||||
|
||||
stio void stio_intisckadrforeth (stio_sckadr_t* sckadr, int ifindex, stio_ethadr_t* ethadr)
|
||||
{
|
||||
struct sockaddr_ll* sll = (struct sockaddr_in*)sckadr;
|
||||
STIO_MEMSET (sll, 0, STIO_SIZEOF(*sll));
|
||||
sll->sll_family = AF_PACKET;
|
||||
sll->sll_ifindex = ifindex;
|
||||
sll->sll_halen = STIO_ETHADR_LEN;
|
||||
STIO_MEMSET (sll->sll_addr, ethadr, STIO_ETHADR_LEN);
|
||||
}
|
||||
#endif
|
||||
|
||||
static stio_devadr_t* sckadr_to_devadr (stio_dev_sck_t* dev, const stio_sckadr_t* sckadr, stio_devadr_t* devadr)
|
||||
{
|
||||
if (sckadr)
|
||||
{
|
||||
stio_scklen_t len;
|
||||
|
||||
stio_getsckadrinfo (dev->stio, sckadr, &len, STIO_NULL);
|
||||
devadr->ptr = (void*)sckadr;
|
||||
devadr->len = len;
|
||||
return devadr;
|
||||
}
|
||||
|
||||
return STIO_NULL;
|
||||
}
|
||||
|
||||
static STIO_INLINE stio_sckadr_t* devadr_to_sckadr (stio_dev_sck_t* dev, const stio_devadr_t* devadr, stio_sckadr_t* sckadr)
|
||||
{
|
||||
return (stio_sckadr_t*)devadr->ptr;
|
||||
}
|
||||
/* ========================================================================= */
|
||||
|
||||
#define IS_STATEFUL(sck) ((sck)->dev_capa & STIO_DEV_CAPA_STREAM)
|
||||
@ -120,7 +178,6 @@ struct sck_type_map_t
|
||||
int type;
|
||||
int proto;
|
||||
int extra_dev_capa;
|
||||
int sck_capa;
|
||||
};
|
||||
|
||||
static struct sck_type_map_t sck_type_map[] =
|
||||
@ -131,7 +188,9 @@ static struct sck_type_map_t sck_type_map[] =
|
||||
{ AF_INET6, SOCK_DGRAM, 0, 0 },
|
||||
|
||||
{ AF_PACKET, SOCK_RAW, STIO_CONST_HTON16(0x0806), 0 },
|
||||
{ AF_PACKET, SOCK_DGRAM, STIO_CONST_HTON16(0x0806), 0 }
|
||||
{ AF_PACKET, SOCK_DGRAM, STIO_CONST_HTON16(0x0806), 0 },
|
||||
|
||||
{ AF_INET, SOCK_RAW, IPPROTO_ICMP, 0, }
|
||||
};
|
||||
|
||||
/* ======================================================================== */
|
||||
@ -229,7 +288,7 @@ static stio_syshnd_t dev_sck_getsyshnd (stio_dev_t* dev)
|
||||
return (stio_syshnd_t)rdev->sck;
|
||||
}
|
||||
|
||||
static int dev_sck_read_stateful (stio_dev_t* dev, void* buf, stio_len_t* len, stio_adr_t* srcadr)
|
||||
static int dev_sck_read_stateful (stio_dev_t* dev, void* buf, stio_len_t* len, stio_devadr_t* srcadr)
|
||||
{
|
||||
stio_dev_sck_t* tcp = (stio_dev_sck_t*)dev;
|
||||
ssize_t x;
|
||||
@ -247,14 +306,14 @@ static int dev_sck_read_stateful (stio_dev_t* dev, void* buf, stio_len_t* len, s
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int dev_sck_read_stateless (stio_dev_t* dev, void* buf, stio_len_t* len, stio_adr_t* srcadr)
|
||||
static int dev_sck_read_stateless (stio_dev_t* dev, void* buf, stio_len_t* len, stio_devadr_t* srcadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
stio_scklen_t srcadrlen;
|
||||
ssize_t x;
|
||||
|
||||
srcadrlen = srcadr->len;
|
||||
x = recvfrom (rdev->sck, buf, *len, 0, srcadr->ptr, &srcadrlen);
|
||||
srcadrlen = STIO_SIZEOF(rdev->peeradr);
|
||||
x = recvfrom (rdev->sck, buf, *len, 0, (struct sockaddr*)&rdev->peeradr, &srcadrlen);
|
||||
if (x <= -1)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data available */
|
||||
@ -263,13 +322,15 @@ static int dev_sck_read_stateless (stio_dev_t* dev, void* buf, stio_len_t* len,
|
||||
return -1;
|
||||
}
|
||||
|
||||
srcadr->ptr = &rdev->peeradr;
|
||||
srcadr->len = srcadrlen;
|
||||
|
||||
*len = x;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int dev_sck_write_stateful (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_adr_t* dstadr)
|
||||
static int dev_sck_write_stateful (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_devadr_t* dstadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
ssize_t x;
|
||||
@ -305,7 +366,7 @@ static int dev_sck_write_stateful (stio_dev_t* dev, const void* data, stio_len_t
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int dev_sck_write_stateless (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_adr_t* dstadr)
|
||||
static int dev_sck_write_stateless (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_devadr_t* dstadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
ssize_t x;
|
||||
@ -402,7 +463,7 @@ static int dev_sck_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
}
|
||||
|
||||
rdev->state |= STIO_DEV_SCK_CONNECTING;
|
||||
rdev->peer = conn->addr;
|
||||
rdev->peeradr = conn->addr;
|
||||
rdev->on_connect = conn->on_connect;
|
||||
rdev->on_disconnect = conn->on_disconnect;
|
||||
return 0;
|
||||
@ -415,7 +476,7 @@ static int dev_sck_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
|
||||
/* connected immediately */
|
||||
rdev->state |= STIO_DEV_SCK_CONNECTED;
|
||||
rdev->peer = conn->addr;
|
||||
rdev->peeradr = conn->addr;
|
||||
rdev->on_connect = conn->on_connect;
|
||||
rdev->on_disconnect = conn->on_disconnect;
|
||||
return 0;
|
||||
@ -616,7 +677,7 @@ static int dev_evcb_sck_ready_stateful (stio_dev_t* dev, int events)
|
||||
|
||||
clidev->dev_capa |= STIO_DEV_CAPA_IN | STIO_DEV_CAPA_OUT | STIO_DEV_CAPA_STREAM;
|
||||
clidev->state |= STIO_DEV_SCK_ACCEPTED;
|
||||
clidev->peer = peer;
|
||||
clidev->peeradr = peer;
|
||||
/*clidev->parent = sck;*/
|
||||
|
||||
/* inherit some event handlers from the parent.
|
||||
@ -680,52 +741,63 @@ static int dev_evcb_sck_ready_stateless (stio_dev_t* dev, int events)
|
||||
return 1; /* the device is ok. carry on reading or writing */
|
||||
}
|
||||
|
||||
static int dev_evcb_sck_on_read (stio_dev_t* dev, const void* data, stio_len_t dlen, const stio_adr_t* adr)
|
||||
static int dev_evcb_sck_on_read_stateful (stio_dev_t* dev, const void* data, stio_len_t dlen, const stio_devadr_t* srcadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
return rdev->on_read (rdev, data, dlen, adr);
|
||||
return rdev->on_read (rdev, data, dlen, STIO_NULL);
|
||||
}
|
||||
|
||||
static int dev_evcb_sck_on_write (stio_dev_t* dev, stio_len_t wrlen, void* wrctx, const stio_adr_t* adr)
|
||||
static int dev_evcb_sck_on_write_stateful (stio_dev_t* dev, stio_len_t wrlen, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
return rdev->on_write (rdev, wrlen, wrctx);
|
||||
return rdev->on_write (rdev, wrlen, wrctx, STIO_NULL);
|
||||
}
|
||||
|
||||
static int dev_evcb_sck_on_read_stateless (stio_dev_t* dev, const void* data, stio_len_t dlen, const stio_devadr_t* srcadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
return rdev->on_read (rdev, data, dlen, srcadr->ptr);
|
||||
}
|
||||
|
||||
static int dev_evcb_sck_on_write_stateless (stio_dev_t* dev, stio_len_t wrlen, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
stio_dev_sck_t* rdev = (stio_dev_sck_t*)dev;
|
||||
return rdev->on_write (rdev, wrlen, wrctx, dstadr->ptr);
|
||||
}
|
||||
|
||||
static stio_dev_evcb_t dev_evcb_sck_stateful =
|
||||
{
|
||||
dev_evcb_sck_ready_stateful,
|
||||
dev_evcb_sck_on_read,
|
||||
dev_evcb_sck_on_write
|
||||
dev_evcb_sck_on_read_stateful,
|
||||
dev_evcb_sck_on_write_stateful
|
||||
};
|
||||
|
||||
static stio_dev_evcb_t dev_evcb_sck_stateless =
|
||||
{
|
||||
dev_evcb_sck_ready_stateless,
|
||||
dev_evcb_sck_on_read,
|
||||
dev_evcb_sck_on_write
|
||||
dev_evcb_sck_on_read_stateless,
|
||||
dev_evcb_sck_on_write_stateless
|
||||
};
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
stio_dev_sck_t* stio_dev_sck_make (stio_t* stio, stio_size_t xtnsize, const stio_dev_sck_make_t* mkinf)
|
||||
stio_dev_sck_t* stio_dev_sck_make (stio_t* stio, stio_size_t xtnsize, const stio_dev_sck_make_t* info)
|
||||
{
|
||||
stio_dev_sck_t* rdev;
|
||||
|
||||
|
||||
if (mkinf->type < 0 && mkinf->type >= STIO_COUNTOF(sck_type_map))
|
||||
if (info->type < 0 && info->type >= STIO_COUNTOF(sck_type_map))
|
||||
{
|
||||
stio->errnum = STIO_EINVAL;
|
||||
return STIO_NULL;
|
||||
}
|
||||
|
||||
if (sck_type_map[mkinf->type].extra_dev_capa & STIO_DEV_CAPA_STREAM) /* can't use the IS_STATEFUL() macro yet */
|
||||
if (sck_type_map[info->type].extra_dev_capa & STIO_DEV_CAPA_STREAM) /* can't use the IS_STATEFUL() macro yet */
|
||||
{
|
||||
rdev = (stio_dev_sck_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_sck_t) + xtnsize, &dev_mth_sck_stateful, &dev_evcb_sck_stateful, (void*)mkinf);
|
||||
rdev = (stio_dev_sck_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_sck_t) + xtnsize, &dev_mth_sck_stateful, &dev_evcb_sck_stateful, (void*)info);
|
||||
}
|
||||
else
|
||||
{
|
||||
rdev = (stio_dev_sck_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_sck_t) + xtnsize, &dev_mth_sck_stateless, &dev_evcb_sck_stateless, (void*)mkinf);
|
||||
rdev = (stio_dev_sck_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_sck_t) + xtnsize, &dev_mth_sck_stateless, &dev_evcb_sck_stateless, (void*)info);
|
||||
}
|
||||
|
||||
return rdev;
|
||||
@ -746,12 +818,14 @@ int stio_dev_sck_listen (stio_dev_sck_t* dev, stio_dev_sck_listen_t* info)
|
||||
return stio_dev_ioctl ((stio_dev_t*)dev, STIO_DEV_SCK_LISTEN, info);
|
||||
}
|
||||
|
||||
int stio_dev_sck_write (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, void* wrctx, const stio_adr_t* dstadr)
|
||||
int stio_dev_sck_write (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, void* wrctx, const stio_sckadr_t* dstadr)
|
||||
{
|
||||
return stio_dev_write ((stio_dev_t*)dev, data, dlen, wrctx, dstadr);
|
||||
stio_devadr_t devadr;
|
||||
return stio_dev_write ((stio_dev_t*)dev, data, dlen, wrctx, sckadr_to_devadr(dev, dstadr, &devadr));
|
||||
}
|
||||
|
||||
int stio_dev_sck_timedwrite (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, const stio_ntime_t* tmout, void* wrctx, const stio_adr_t* dstadr)
|
||||
int stio_dev_sck_timedwrite (stio_dev_sck_t* dev, const void* data, stio_len_t dlen, const stio_ntime_t* tmout, void* wrctx, const stio_sckadr_t* dstadr)
|
||||
{
|
||||
return stio_dev_write ((stio_dev_t*)dev, data, dlen, wrctx, dstadr);
|
||||
stio_devadr_t devadr;
|
||||
return stio_dev_timedwrite ((stio_dev_t*)dev, data, dlen, tmout, wrctx, sckadr_to_devadr(dev, dstadr, &devadr));
|
||||
}
|
||||
|
@ -101,15 +101,16 @@ typedef enum stio_dev_sck_state_t stio_dev_sck_state_t;
|
||||
typedef struct stio_dev_sck_t stio_dev_sck_t;
|
||||
|
||||
typedef int (*stio_dev_sck_on_read_t) (
|
||||
stio_dev_sck_t* dev,
|
||||
const void* data,
|
||||
stio_len_t dlen,
|
||||
const stio_adr_t* srcadr
|
||||
stio_dev_sck_t* dev,
|
||||
const void* data,
|
||||
stio_len_t dlen,
|
||||
const stio_sckadr_t* srcadr
|
||||
);
|
||||
typedef int (*stio_dev_sck_on_write_t) (
|
||||
stio_dev_sck_t* dev,
|
||||
stio_len_t wrlen,
|
||||
void* wrctx
|
||||
stio_dev_sck_t* dev,
|
||||
stio_len_t wrlen,
|
||||
void* wrctx,
|
||||
const stio_sckadr_t* dstadr
|
||||
);
|
||||
|
||||
typedef int (*stio_dev_sck_on_connect_t) (stio_dev_sck_t* dev);
|
||||
@ -123,7 +124,13 @@ enum stio_dev_sck_type_t
|
||||
STIO_DEV_SCK_UDP6,
|
||||
|
||||
STIO_DEV_SCK_ARP,
|
||||
STIO_DEV_SCK_ARP_DGRAM
|
||||
STIO_DEV_SCK_ARP_DGRAM,
|
||||
|
||||
STIO_DEV_SCK_ICMP4
|
||||
|
||||
#if 0
|
||||
STIO_DEV_SCK_RAW, /* raw L2-level packet */
|
||||
#endif
|
||||
};
|
||||
typedef enum stio_dev_sck_type_t stio_dev_sck_type_t;
|
||||
|
||||
@ -165,11 +172,9 @@ struct stio_dev_sck_accept_t
|
||||
{
|
||||
stio_syshnd_t sck;
|
||||
/* TODO: add timeout */
|
||||
stio_sckadr_t peer;
|
||||
stio_sckadr_t peeradr;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct stio_dev_sck_t
|
||||
{
|
||||
STIO_DEV_HEADERS;
|
||||
@ -186,7 +191,16 @@ struct stio_dev_sck_t
|
||||
stio_dev_sck_on_connect_t on_connect;
|
||||
stio_dev_sck_on_disconnect_t on_disconnect;
|
||||
stio_tmridx_t tmridx_connect;
|
||||
stio_sckadr_t peer;
|
||||
|
||||
/* peer address for a stateful stream socket. valid if one of the
|
||||
* followings is set in state:
|
||||
* STIO_DEV_TCP_ACCEPTED
|
||||
* STIO_DEV_TCP_CONNECTED
|
||||
* STIO_DEV_TCP_CONNECTING
|
||||
*
|
||||
* also used as a placeholder to store source address for
|
||||
* a stateless socket */
|
||||
stio_sckadr_t peeradr;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -245,7 +259,7 @@ STIO_EXPORT int stio_dev_sck_write (
|
||||
const void* data,
|
||||
stio_len_t len,
|
||||
void* wrctx,
|
||||
const stio_adr_t* dstadr
|
||||
const stio_sckadr_t* dstadr
|
||||
);
|
||||
|
||||
STIO_EXPORT int stio_dev_sck_timedwrite (
|
||||
@ -254,7 +268,7 @@ STIO_EXPORT int stio_dev_sck_timedwrite (
|
||||
stio_len_t len,
|
||||
const stio_ntime_t* tmout,
|
||||
void* wrctx,
|
||||
const stio_adr_t* dstadr
|
||||
const stio_sckadr_t* dstadr
|
||||
);
|
||||
|
||||
#if defined(STIO_HAVE_INLINE)
|
||||
@ -271,7 +285,7 @@ static STIO_INLINE int stio_dev_sck_read (stio_dev_sck_t* sck, int enabled)
|
||||
}
|
||||
|
||||
/*
|
||||
static STIO_INLINE int stio_dev_sck_write (stio_dev_sck_t* sck, const void* data, stio_len_t len, void* wrctx, const stio_adr_t* dstadr)
|
||||
static STIO_INLINE int stio_dev_sck_write (stio_dev_sck_t* sck, const void* data, stio_len_t len, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
return stio_dev_write ((stio_dev_t*)sck, data, len, wrctx, STIO_NULL);
|
||||
}
|
||||
|
@ -264,7 +264,7 @@ static int tcp_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
}
|
||||
|
||||
tcp->state |= STIO_DEV_TCP_CONNECTING;
|
||||
tcp->peer = conn->addr;
|
||||
tcp->peeradr = conn->addr;
|
||||
tcp->on_connect = conn->on_connect;
|
||||
tcp->on_disconnect = conn->on_disconnect;
|
||||
return 0;
|
||||
@ -277,7 +277,7 @@ static int tcp_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
|
||||
/* connected immediately */
|
||||
tcp->state |= STIO_DEV_TCP_CONNECTED;
|
||||
tcp->peer = conn->addr;
|
||||
tcp->peeradr = conn->addr;
|
||||
tcp->on_connect = conn->on_connect;
|
||||
tcp->on_disconnect = conn->on_disconnect;
|
||||
return 0;
|
||||
@ -465,7 +465,7 @@ printf ("TCP READY...%p\n", dev);
|
||||
|
||||
clitcp->dev_capa |= STIO_DEV_CAPA_IN | STIO_DEV_CAPA_OUT | STIO_DEV_CAPA_STREAM;
|
||||
clitcp->state |= STIO_DEV_TCP_ACCEPTED;
|
||||
clitcp->peer = peer;
|
||||
clitcp->peeradr = peer;
|
||||
/*clitcp->parent = tcp;*/
|
||||
|
||||
/* inherit some event handlers from the parent.
|
||||
|
@ -68,7 +68,7 @@ struct stio_dev_tcp_t
|
||||
* STIO_DEV_TCP_ACCEPTED
|
||||
* STIO_DEV_TCP_CONNECTED
|
||||
* STIO_DEV_TCP_CONNECTING */
|
||||
stio_sckadr_t peer;
|
||||
stio_sckadr_t peeradr;
|
||||
|
||||
/** return 0 on succes, -1 on failure/
|
||||
* called on a new tcp device for an accepted client or
|
||||
@ -121,7 +121,7 @@ struct stio_dev_tcp_accept_t
|
||||
{
|
||||
stio_syshnd_t sck;
|
||||
/* TODO: add timeout */
|
||||
stio_sckadr_t peer;
|
||||
stio_sckadr_t peeradr;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -25,6 +25,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#if 0
|
||||
#include "stio-udp.h"
|
||||
#include "stio-prv.h"
|
||||
|
||||
@ -82,7 +83,7 @@ static stio_syshnd_t udp_getsyshnd (stio_dev_t* dev)
|
||||
return (stio_syshnd_t)udp->sck;
|
||||
}
|
||||
|
||||
static int udp_read (stio_dev_t* dev, void* buf, stio_len_t* len, stio_adr_t* adr)
|
||||
static int udp_read (stio_dev_t* dev, void* buf, stio_len_t* len, stio_devadr_t* adr)
|
||||
{
|
||||
stio_dev_udp_t* udp = (stio_dev_udp_t*)dev;
|
||||
stio_scklen_t addrlen;
|
||||
@ -90,8 +91,8 @@ static int udp_read (stio_dev_t* dev, void* buf, stio_len_t* len, stio_adr_t* ad
|
||||
|
||||
/* TODO: udp_read need source address ... have to extend the send callback to accept the source address */
|
||||
printf ("UDP RECVFROM...\n");
|
||||
addrlen = STIO_SIZEOF(udp->peer);
|
||||
x = recvfrom (udp->sck, buf, *len, 0, (struct sockaddr*)&udp->peer, &addrlen);
|
||||
addrlen = STIO_SIZEOF(udp->peeradr);
|
||||
x = recvfrom (udp->sck, buf, *len, 0, (struct sockaddr*)&udp->peeradr, &addrlen);
|
||||
if (x <= -1)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data available */
|
||||
@ -104,7 +105,7 @@ printf ("UDP RECVFROM...\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int udp_write (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_adr_t* adr)
|
||||
static int udp_write (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_devadr_t* adr)
|
||||
{
|
||||
stio_dev_udp_t* udp = (stio_dev_udp_t*)udp;
|
||||
ssize_t x;
|
||||
@ -184,3 +185,5 @@ stio_dev_udp_t* stio_dev_udp_make (stio_t* stio, stio_size_t xtnsize, const stio
|
||||
{
|
||||
return (stio_dev_udp_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_udp_t) + xtnsize, &udp_mth, &udp_evcb, (void*)data);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -74,12 +74,12 @@ static STIO_INLINE int stio_dev_udp_read (stio_dev_udp_t* udp, int enabled)
|
||||
return stio_dev_read ((stio_dev_t*)udp, enabled);
|
||||
}
|
||||
|
||||
static STIO_INLINE int stio_dev_udp_write (stio_dev_udp_t* udp, const void* data, stio_len_t len, void* wrctx, const stio_adr_t* dstadr)
|
||||
static STIO_INLINE int stio_dev_udp_write (stio_dev_udp_t* udp, const void* data, stio_len_t len, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
return stio_dev_write ((stio_dev_t*)udp, data, len, wrctx, dstadr);
|
||||
}
|
||||
|
||||
static STIO_INLINE int stio_dev_udp_timedwrite (stio_dev_udp_t* udp, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_adr_t* dstadr)
|
||||
static STIO_INLINE int stio_dev_udp_timedwrite (stio_dev_udp_t* udp, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
return stio_dev_timedwrite ((stio_dev_t*)udp, data, len, tmout, wrctx, dstadr);
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ printf ("has urgent data...\n");
|
||||
|
||||
if (dev && stio->revs[i].events & EPOLLIN)
|
||||
{
|
||||
stio_adr_t srcadr;
|
||||
stio_devadr_t srcadr;
|
||||
stio_len_t len;
|
||||
int x;
|
||||
|
||||
@ -750,7 +750,7 @@ static void on_write_timeout (stio_t* stio, const stio_ntime_t* now, stio_tmrjob
|
||||
if (x <= -1) stio_dev_halt (dev);
|
||||
}
|
||||
|
||||
static int __dev_write (stio_dev_t* dev, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_adr_t* dstadr)
|
||||
static int __dev_write (stio_dev_t* dev, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
const stio_uint8_t* uptr;
|
||||
stio_len_t urem, ulen;
|
||||
@ -894,12 +894,12 @@ enqueue_data:
|
||||
return 0; /* request pused to a write queue. */
|
||||
}
|
||||
|
||||
int stio_dev_write (stio_dev_t* dev, const void* data, stio_len_t len, void* wrctx, const stio_adr_t* dstadr)
|
||||
int stio_dev_write (stio_dev_t* dev, const void* data, stio_len_t len, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
return __dev_write (dev, data, len, STIO_NULL, wrctx, dstadr);
|
||||
}
|
||||
|
||||
int stio_dev_timedwrite (stio_dev_t* dev, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_adr_t* dstadr)
|
||||
int stio_dev_timedwrite (stio_dev_t* dev, const void* data, stio_len_t len, const stio_ntime_t* tmout, void* wrctx, const stio_devadr_t* dstadr)
|
||||
{
|
||||
return __dev_write (dev, data, len, tmout, wrctx, dstadr);
|
||||
}
|
||||
|
@ -48,8 +48,8 @@ struct stio_ntime_t
|
||||
#define STIO_SYSHND_INVALID (-1)
|
||||
#endif
|
||||
|
||||
typedef struct stio_adr_t stio_adr_t;
|
||||
struct stio_adr_t
|
||||
typedef struct stio_devadr_t stio_devadr_t;
|
||||
struct stio_devadr_t
|
||||
{
|
||||
int len;
|
||||
void* ptr;
|
||||
@ -143,10 +143,10 @@ struct stio_dev_mth_t
|
||||
/* return -1 on failure, 0 if no data is availble, 1 otherwise.
|
||||
* when returning 1, *len must be sent to the length of data read.
|
||||
* if *len is set to 0, it's treated as EOF. */
|
||||
int (*read) (stio_dev_t* dev, void* data, stio_len_t* len, stio_adr_t* srcadr);
|
||||
int (*read) (stio_dev_t* dev, void* data, stio_len_t* len, stio_devadr_t* srcadr);
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
int (*write) (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_adr_t* dstadr);
|
||||
int (*write) (stio_dev_t* dev, const void* data, stio_len_t* len, const stio_devadr_t* dstadr);
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
int (*ioctl) (stio_dev_t* dev, int cmd, void* arg);
|
||||
@ -163,13 +163,13 @@ struct stio_dev_evcb_t
|
||||
/* return -1 on failure, 0 or 1 on success.
|
||||
* when 0 is returned, the main loop stops the attempt to read more data.
|
||||
* when 1 is returned, the main loop attempts to read more data without*/
|
||||
int (*on_read) (stio_dev_t* dev, const void* data, stio_len_t len, const stio_adr_t* srcadr);
|
||||
int (*on_read) (stio_dev_t* dev, const void* data, stio_len_t len, const stio_devadr_t* srcadr);
|
||||
|
||||
/* return -1 on failure, 0 on success.
|
||||
* wrlen is the length of data written. it is the length of the originally
|
||||
* posted writing request for a stream device. For a non stream device, it
|
||||
* may be shorter than the originally posted length. */
|
||||
int (*on_write) (stio_dev_t* dev, stio_len_t wrlen, void* wrctx, const stio_adr_t* dstadr);
|
||||
int (*on_write) (stio_dev_t* dev, stio_len_t wrlen, void* wrctx, const stio_devadr_t* dstadr);
|
||||
};
|
||||
|
||||
struct stio_wq_t
|
||||
@ -184,7 +184,7 @@ struct stio_wq_t
|
||||
stio_dev_t* dev; /* back-pointer to the device */
|
||||
|
||||
stio_tmridx_t tmridx;
|
||||
stio_adr_t dstadr;
|
||||
stio_devadr_t dstadr;
|
||||
};
|
||||
|
||||
#define STIO_WQ_INIT(wq) ((wq)->next = (wq)->prev = (wq))
|
||||
@ -368,7 +368,7 @@ STIO_EXPORT int stio_dev_write (
|
||||
const void* data,
|
||||
stio_len_t len,
|
||||
void* wrctx,
|
||||
const stio_adr_t* dstadr
|
||||
const stio_devadr_t* dstadr
|
||||
);
|
||||
|
||||
|
||||
@ -378,7 +378,7 @@ STIO_EXPORT int stio_dev_timedwrite (
|
||||
stio_len_t len,
|
||||
const stio_ntime_t* tmout,
|
||||
void* wrctx,
|
||||
const stio_adr_t* dstadr
|
||||
const stio_devadr_t* dstadr
|
||||
);
|
||||
|
||||
STIO_EXPORT void stio_dev_halt (
|
||||
|
Loading…
Reference in New Issue
Block a user