diff options
author | Mauro Sardara <msardara@cisco.com> | 2021-05-17 09:42:53 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@fd.io> | 2021-05-17 09:42:53 +0000 |
commit | 31eea8b286ded60b37fcc87de4beb025eb59924e (patch) | |
tree | 40b1f93a269ad5422d517bfa141957d0b7559a50 /ctrl/facemgr/examples/mobility/mobility.c | |
parent | 0982497d26806bad1a069766ac46a4f238d850ab (diff) | |
parent | 40d22455f1295d0bff005209bbf73e7e80799de7 (diff) |
Merge "[HICN-701] facemgr: add priority controller mobility example"
Diffstat (limited to 'ctrl/facemgr/examples/mobility/mobility.c')
-rw-r--r-- | ctrl/facemgr/examples/mobility/mobility.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ctrl/facemgr/examples/mobility/mobility.c b/ctrl/facemgr/examples/mobility/mobility.c new file mode 100644 index 000000000..528951446 --- /dev/null +++ b/ctrl/facemgr/examples/mobility/mobility.c @@ -0,0 +1,88 @@ +/* + * Dummy server sending alternating bytes to all clients. + * + * This program can be used to trigger mobility events in the hICN forwarder, to + * switch from WiFi to LTE and back, at regular intervals. + * + * Test server using nc: nc -4kvul localhost 9533 + */ + +#include <arpa/inet.h> // inet_ntop +#include <errno.h> // EINTR,. .. +#include <netinet/in.h> // INET_ADDRSTRLEN, INET6_ADDRSTRLEN +#include <stdio.h> +#include <inttypes.h> + +#include <stdlib.h> +#include <sys/socket.h> +#include <sys/timerfd.h> +#include <sys/un.h> // sockaddr_un +#include <unistd.h> // fcntl +#include <fcntl.h> // fcntl + +#define MS2US(x) (x * 1000) + +/** + * \brief Main function + */ +int main(int argc, char **argv) +{ + int rc; + + if (argc != 4) { + fprintf(stderr, "Usage: %s IP PORT INTERVAL\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, " IP Target hostname\n"); + fprintf(stderr, " PORT Target port\n"); + fprintf(stderr, " INTERVAL Interval between mobility events (in ms)\n"); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); + } + + int interval = atoi(argv[3]); + + int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (fd < 0) { + perror("socket"); + goto ERR_SOCKET; + } + + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(argv[1]); + addr.sin_port = htons(atoi(argv[2])); + + if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + perror("connect"); + goto ERR_CONNECT; + } + + unsigned state = 0; + char buf[1]; + for(;;) { + usleep(MS2US(interval)); + + buf[0] = state; + rc = send(fd, buf, 1, 0); + if (rc < 0) { + if (errno == ECONNREFUSED) { + continue; + } + perror("send"); + goto ERR_SEND; + } + + state = 1 - state; + } + + close(fd); + + exit(EXIT_SUCCESS); + +ERR_SEND: +ERR_CONNECT: + close(fd); +ERR_SOCKET: + exit(EXIT_FAILURE); +} |