+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
meshlink_handle_t *mesh;
meshlink_channel_t *channel;
size_t received;
+ bool got_large_packet;
};
-static void log_cb(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *text) {
- static struct timeval tv0;
- struct timeval tv;
-
- if(tv0.tv_sec == 0) {
- gettimeofday(&tv0, NULL);
- }
-
- gettimeofday(&tv, NULL);
- fprintf(stderr, "%u.%.03u ", (unsigned int)(tv.tv_sec - tv0.tv_sec), (unsigned int)tv.tv_usec / 1000);
-
- if(mesh) {
- fprintf(stderr, "(%s) ", mesh->name);
- }
-
- fprintf(stderr, "[%d] %s\n", level, text);
-}
-
static void server_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
(void)data;
for(int i = 0; i < 3; i++) {
if(c[i] == channel) {
c[i] = NULL;
- fprintf(stderr, "server received channel %d closure from %s\n", i, channel->node->name);
-
meshlink_channel_close(mesh, channel);
}
(void)data;
// We expect always the same amount of data from the server.
- assert(len == 1000);
assert(mesh->priv);
struct client *client = mesh->priv;
+ assert(len == 512 || len == 65536);
client->received += len;
+
+ if(len == 65536) {
+ client->got_large_packet = true;
+ }
}
static void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
assert(mesh->priv);
struct client *client = mesh->priv;
- assert(reachable);
-
- if(!strcmp(node->name, "server")) {
+ if(reachable && !strcmp(node->name, "server")) {
assert(!client->channel);
client->channel = meshlink_channel_open_ex(mesh, node, 1, client_receive_cb, NULL, 0, MESHLINK_CHANNEL_UDP);
assert(client->channel);
for(int i = 0; i < 3; i++) {
if(c[i] == NULL) {
- fprintf(stderr, "server accepted channel %d from %s\n", i, channel->node->name);
c[i] = channel;
if(i == 2) {
return false;
}
-int main() {
- //meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
+int main(void) {
+ init_sync_flag(&accept_flag);
+ init_sync_flag(&close_flag);
+
+ meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb);
- // Open two new meshlink instance.
+ // Open four new meshlink instance, the server and three peers.
const char *names[3] = {"foo", "bar", "baz"};
struct client clients[3];
meshlink_channel_t *channels[3] = {NULL, NULL, NULL};
memset(clients, 0, sizeof(clients));
+ assert(meshlink_destroy("channels_udp_conf.0"));
meshlink_handle_t *server = meshlink_open("channels_udp_conf.0", "server", "channels-udp", DEV_CLASS_BACKBONE);
assert(server);
meshlink_enable_discovery(server, false);
for(int i = 0; i < 3; i++) {
char dir[100];
snprintf(dir, sizeof(dir), "channels_udp_conf.%d", i + 1);
+ assert(meshlink_destroy(dir));
clients[i].mesh = meshlink_open(dir, names[i], "channels-udp", DEV_CLASS_STATIONARY);
assert(clients[i].mesh);
clients[i].mesh->priv = &clients[i];
assert(clients[i].channel);
}
+ // Check that we can send up to 65535 bytes without errors
+
+ char large_data[65536] = "";
+
+ for(int i = 0; i < 3; i++) {
+ assert(meshlink_channel_send(server, channels[i], large_data, sizeof(large_data) + 1) == -1);
+ assert(meshlink_channel_send(server, channels[i], large_data, sizeof(large_data)) == sizeof(large_data));
+ }
+
+ // Assert that packets larger than 64 kiB are not allowed
+
+ assert(meshlink_channel_send(server, channels[0], large_data, 65537) == -1);
+
// Stream packets from server to clients for 5 seconds at 40 Mbps (1 kB * 500 Hz)
- char data[1000];
+ char data[512];
memset(data, 'U', sizeof(data));
for(int j = 0; j < 2500; j++) {
}
const struct timespec req = {0, 2000000};
- clock_nanosleep(CLOCK_MONOTONIC, 0, &req, NULL);
+ nanosleep(&req, NULL);
}
// Let the clients close the channels
}
for(int i = 0; i < 3; i++) {
- assert(clients[i].received >= 2400000);
- assert(clients[i].received <= 2500000);
+ assert(clients[i].received >= 1000000);
+ assert(clients[i].received <= 1345536);
+ assert(clients[i].got_large_packet);
}
// Clean up.