From 9e4aa98c043f0a867a6ab7bf43bac740ad1ea11d Mon Sep 17 00:00:00 2001 From: Martin/Geno Date: Sun, 5 Aug 2018 07:58:16 +0200 Subject: [PATCH] first udp (with multicast try) --- wireless/wifictld/src/include.h | 8 ++++ wireless/wifictld/src/main.c | 13 ++++++ wireless/wifictld/src/socket.c | 73 +++++++++++++++++++++++++++++++++ wireless/wifictld/src/socket.h | 13 ++++++ 4 files changed, 107 insertions(+) create mode 100644 wireless/wifictld/src/socket.c create mode 100644 wireless/wifictld/src/socket.h diff --git a/wireless/wifictld/src/include.h b/wireless/wifictld/src/include.h index 1428e47..937cdb6 100644 --- a/wireless/wifictld/src/include.h +++ b/wireless/wifictld/src/include.h @@ -12,6 +12,14 @@ #include #include #include +#ifndef MINI +#include +#include +#include +#include +#include +#include +#endif #include #include "hostapd/ieee802_11_defs.h" // ETH_ALEN + hwaddr_aton #include "hostapd/common.h" diff --git a/wireless/wifictld/src/main.c b/wireless/wifictld/src/main.c index 80fcbb3..d04d613 100644 --- a/wireless/wifictld/src/main.c +++ b/wireless/wifictld/src/main.c @@ -4,6 +4,10 @@ #include "wifi_clients.h" #include "ubus.h" +#ifndef MINI +#include "socket.h" +#endif + struct option longopts[] = { {"verbose", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, @@ -150,6 +154,15 @@ int main(int argc, char *argv[]) log_error("exit with error on ubus init\n"); return ret; } + #ifndef MINI + ret = socket_init("br-lan"); + if (ret) + { + socket_close(); + log_error("exit with error on socket init\n"); + return ret; + } + #endif uloop_run(); uloop_done(); diff --git a/wireless/wifictld/src/socket.c b/wireless/wifictld/src/socket.c new file mode 100644 index 0000000..210d320 --- /dev/null +++ b/wireless/wifictld/src/socket.c @@ -0,0 +1,73 @@ +#include "include.h" +#include "log.h" +#include "socket.h" + +static struct uloop_fd server; + +static void server_cb(struct uloop_fd *fd, unsigned int events) { + struct sockaddr_in6 addr; + char buf[REQUEST_MAXLEN]; + char control[256]; + + + struct iovec iv = { + .iov_base = buf, + .iov_len = sizeof(buf) - 1 + }; + + struct msghdr mh = { + .msg_name = &addr, + .msg_namelen = sizeof(addr), + .msg_iov = &iv, + .msg_iovlen = 1, + .msg_control = control, + .msg_controllen = sizeof(control) + }; + + if (recvmsg(server.fd, &mh, MSG_WAITALL) < 0) { + log_info("socket: invalid package\n"); + return; + } + + char addr_str[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &(addr.sin6_addr), addr_str, INET6_ADDRSTRLEN); + log_info("socket:recv [%s]:%d - %s\n", addr_str, ntohs(addr.sin6_port), buf); + + + if (sendto(server.fd, addr_str, sizeof(addr_str) - 1, 0, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + log_error("socket: could not send answer\n"); + } + log_info("socket: send answer\n"); +} + +int socket_init(char *ifname) { + server.cb = server_cb; + server.fd = usock(USOCK_UDP | USOCK_SERVER | USOCK_IPV6ONLY | USOCK_NUMERIC, SOCKET_ADDR, SOCKET_PORT); + if (server.fd < 0) { + return 1; + } + struct in6_addr mgroup_addr; + + if (!inet_pton(AF_INET6, SOCKET_MADDR, &mgroup_addr)) { + log_error("socket: invalid multicast group\n"); + return -1; + } + + struct ipv6_mreq mreq; + + mreq.ipv6mr_multiaddr = mgroup_addr; + mreq.ipv6mr_interface = if_nametoindex(ifname); + + if (setsockopt(server.fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == -1) { + log_error("socket: unable to join multicast group\n"); + return -1; + } + + uloop_fd_add(&server, ULOOP_READ); + + return 0; +} + +void socket_close() { + +} diff --git a/wireless/wifictld/src/socket.h b/wireless/wifictld/src/socket.h new file mode 100644 index 0000000..ff1c752 --- /dev/null +++ b/wireless/wifictld/src/socket.h @@ -0,0 +1,13 @@ +#ifndef __WIFICTLD_SOCKET_H +#define __WIFICTLD_SOCKET_H + +#define SOCKET_ADDR "::" +#define SOCKET_MADDR "ff02::31f1" +#define SOCKET_PORT "1000" + +#define REQUEST_MAXLEN 256 + +int socket_init(); +void socket_close(); + +#endif