Commit 8cfa12bd authored by Wesley W. Terpstra's avatar Wesley W. Terpstra

api: differentiate between active and passive open

USB devices on active open flush any pending data
However, this breaks PCIe passive notification (EB header is dropped)
parent 93815557
......@@ -82,7 +82,7 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t
for (transportp = aux->first_transport; transportp != EB_NULL; transportp = transport->next) {
transport = EB_TRANSPORT(transportp);
status = eb_transports[transport->link_type].connect(transport, link, address);
status = eb_transports[transport->link_type].connect(transport, link, address, 0);
if (status != EB_ADDRESS) break;
}
......@@ -202,7 +202,7 @@ eb_status_t eb_socket_passive(eb_socket_t socketp, const char* address) {
for (transportp = aux->first_transport; transportp != EB_NULL; transportp = transport->next) {
transport = EB_TRANSPORT(transportp);
status = eb_transports[transport->link_type].connect(transport, link, address);
status = eb_transports[transport->link_type].connect(transport, link, address, 1);
if (status != EB_ADDRESS) break;
}
......
......@@ -130,7 +130,7 @@ int main(int argc, char** argv) {
return 1;
}
if ((status = eb_posix_udp_connect(transport, &udp_link, argv[1])) != EB_OK) {
if ((status = eb_posix_udp_connect(transport, &udp_link, argv[1], 0)) != EB_OK) {
perror("Cannot resolve address");
return 1;
}
......
......@@ -68,7 +68,7 @@ static struct eb_client* eb_new_client(struct eb_transport* tcp_transport, struc
if (address[x] != 0) goto fail_address;
if (eb_posix_udp_open(&next->udp_transport, 0) != EB_OK) goto fail_transport;
if (eb_posix_udp_connect(&next->udp_transport, &next->udp_slave, address) != EB_OK) goto fail_link;
if (eb_posix_udp_connect(&next->udp_transport, &next->udp_slave, address, 0) != EB_OK) goto fail_link;
return first;
......
......@@ -66,7 +66,7 @@ void eb_dev_close(struct eb_transport* transportp) {
/* noop */
}
eb_status_t eb_dev_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address) {
eb_status_t eb_dev_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address, int passive) {
struct eb_dev_link* link;
const char* devname;
char devpath[256];
......@@ -92,10 +92,12 @@ eb_status_t eb_dev_connect(struct eb_transport* transportp, struct eb_link* link
link->fdes = fdes;
link->flags = fcntl(fdes, F_GETFL, 0);
/* Discard any data unread by last user */
eb_dev_set_blocking(link, 0);
usleep(10000); /* 10 ms */
while (read(fdes, junk, sizeof(junk)) > 0) { }
/* Discard any data unread by last user */
if (!passive) {
usleep(10000); /* 10 ms */
while (read(fdes, junk, sizeof(junk)) > 0) { }
}
return EB_OK;
}
......
......@@ -35,7 +35,7 @@
EB_PRIVATE eb_status_t eb_dev_open(struct eb_transport* transport, const char* port);
EB_PRIVATE void eb_dev_close(struct eb_transport* transport);
EB_PRIVATE eb_status_t eb_dev_connect(struct eb_transport* transport, struct eb_link* link, const char* address);
EB_PRIVATE eb_status_t eb_dev_connect(struct eb_transport* transport, struct eb_link* link, const char* address, int passive);
EB_PRIVATE void eb_dev_disconnect(struct eb_transport* transport, struct eb_link* link);
EB_PRIVATE void eb_dev_fdes(struct eb_transport*, struct eb_link* link, eb_user_data_t data, eb_descriptor_callback_t cb);
EB_PRIVATE int eb_dev_accept(struct eb_transport*, struct eb_link* result_link, eb_user_data_t data, eb_descriptor_callback_t ready);
......
......@@ -83,7 +83,7 @@ struct eb_transport_ops {
EB_PRIVATE eb_status_t eb_lm32_udp_open(struct eb_transport* transport, const char* port);
EB_PRIVATE void eb_lm32_udp_close(struct eb_transport* transport);
EB_PRIVATE eb_status_t eb_lm32_udp_connect(struct eb_transport* transport, struct eb_link* link, const char* address);
EB_PRIVATE eb_status_t eb_lm32_udp_connect(struct eb_transport* transport, struct eb_link* link, const char* address, int passive);
EB_PRIVATE void eb_lm32_udp_disconnect(struct eb_transport* transport, struct eb_link* link);
EB_PRIVATE void eb_lm32_udp_fdes(struct eb_transport* transportp, struct eb_link* link, eb_user_data_t data, eb_descriptor_callback_t cb);
EB_PRIVATE int eb_lm32_udp_accept(struct eb_transport* transportp, struct eb_link* result_link, eb_user_data_t data, eb_descriptor_callback_t ready);
......
......@@ -75,7 +75,7 @@ void eb_posix_tcp_close(struct eb_transport* transportp) {
eb_posix_ip_close(transport->port6);
}
eb_status_t eb_posix_tcp_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address) {
eb_status_t eb_posix_tcp_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address, int passive) {
struct eb_posix_tcp_link* link;
struct sockaddr_storage sa;
eb_posix_sock_t sock;
......
......@@ -36,7 +36,7 @@
EB_PRIVATE eb_status_t eb_posix_tcp_open(struct eb_transport* transport, const char* port);
EB_PRIVATE void eb_posix_tcp_close(struct eb_transport* transport);
EB_PRIVATE eb_status_t eb_posix_tcp_connect(struct eb_transport* transport, struct eb_link* link, const char* address);
EB_PRIVATE eb_status_t eb_posix_tcp_connect(struct eb_transport* transport, struct eb_link* link, const char* address, int passive);
EB_PRIVATE void eb_posix_tcp_disconnect(struct eb_transport* transport, struct eb_link* link);
EB_PRIVATE void eb_posix_tcp_fdes(struct eb_transport*, struct eb_link* link, eb_user_data_t data, eb_descriptor_callback_t cb);
EB_PRIVATE int eb_posix_tcp_accept(struct eb_transport*, struct eb_link* result_link, eb_user_data_t data, eb_descriptor_callback_t ready);
......
......@@ -72,7 +72,7 @@ void eb_posix_udp_close(struct eb_transport* transportp) {
eb_posix_ip_close(transport->socket6);
}
eb_status_t eb_posix_udp_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address) {
eb_status_t eb_posix_udp_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address, int passive) {
struct eb_posix_udp_transport* transport;
struct eb_posix_udp_link* link;
struct sockaddr_storage sa;
......
......@@ -36,7 +36,7 @@
EB_PRIVATE eb_status_t eb_posix_udp_open(struct eb_transport* transport, const char* port);
EB_PRIVATE void eb_posix_udp_close(struct eb_transport* transport);
EB_PRIVATE eb_status_t eb_posix_udp_connect(struct eb_transport* transport, struct eb_link* link, const char* address);
EB_PRIVATE eb_status_t eb_posix_udp_connect(struct eb_transport* transport, struct eb_link* link, const char* address, int passive);
EB_PRIVATE void eb_posix_udp_disconnect(struct eb_transport* transport, struct eb_link* link);
EB_PRIVATE void eb_posix_udp_fdes(struct eb_transport*, struct eb_link* link, eb_user_data_t data, eb_descriptor_callback_t cb);
EB_PRIVATE int eb_posix_udp_accept(struct eb_transport*, struct eb_link* result_link, eb_user_data_t data, eb_descriptor_callback_t ready);
......
......@@ -54,7 +54,7 @@ struct eb_transport_ops {
void (*close)(struct eb_transport* transport);
/* ADDRESS -> simply not used. Other errors reported to user. */
eb_status_t (*connect) (struct eb_transport*, struct eb_link* link, const char* address);
eb_status_t (*connect) (struct eb_transport*, struct eb_link* link, const char* address, int passive);
void (*disconnect)(struct eb_transport*, struct eb_link* link);
/* File descriptor to wait on */
......
......@@ -44,7 +44,7 @@ void eb_tunnel_close(struct eb_transport* transportp) {
/* noop */
}
eb_status_t eb_tunnel_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address) {
eb_status_t eb_tunnel_connect(struct eb_transport* transportp, struct eb_link* linkp, const char* address, int passive) {
const char* slash;
const char* host;
const char* service;
......@@ -72,7 +72,7 @@ eb_status_t eb_tunnel_connect(struct eb_transport* transportp, struct eb_link* l
strncat(tcpname, address + 6, host-(address+6));
strncat(tcpname, host, slash-host);
if ((err = eb_posix_tcp_connect(0, linkp, tcpname)) != EB_OK) return err;
if ((err = eb_posix_tcp_connect(0, linkp, tcpname, passive)) != EB_OK) return err;
eb_posix_tcp_send(0, linkp, (const uint8_t*)service, strlen(service)+1);
return EB_OK;
......
......@@ -35,7 +35,7 @@
EB_PRIVATE eb_status_t eb_tunnel_open(struct eb_transport* transport, const char* port);
EB_PRIVATE void eb_tunnel_close(struct eb_transport* transport);
EB_PRIVATE eb_status_t eb_tunnel_connect(struct eb_transport* transport, struct eb_link* link, const char* address);
EB_PRIVATE eb_status_t eb_tunnel_connect(struct eb_transport* transport, struct eb_link* link, const char* address, int passive);
EB_PRIVATE void eb_tunnel_disconnect(struct eb_transport* transport, struct eb_link* link);
EB_PRIVATE void eb_tunnel_fdes(struct eb_transport*, struct eb_link* link, eb_user_data_t data, eb_descriptor_callback_t cb);
EB_PRIVATE int eb_tunnel_accept(struct eb_transport*, struct eb_link* result_link, eb_user_data_t data, eb_descriptor_callback_t ready);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment