Switch to sending LLMNR packets
authorKai Blin <kai@samba.org>
Sun, 15 May 2011 18:13:03 +0000 (20:13 +0200)
committerKai Blin <kai@samba.org>
Sun, 15 May 2011 18:13:03 +0000 (20:13 +0200)
listener.c
sender.c

index 5276351..6a75182 100644 (file)
@@ -18,9 +18,12 @@ int main(int argc, char **argv)
     int sock6 = -1;
     struct sockaddr_in6 name6;
     ssize_t len6 = sizeof(name6);
+    struct sockaddr_storage peer_addr;
     struct ipv6_mreq mreq;
-    char buf[1024];
+    uint8_t buf[1024];
     ssize_t msg_len;
+    socklen_t peer_addr_len;
+    char host[NI_MAXHOST], service[NI_MAXSERV];
 
     sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
     if (sock6 == -1) {
@@ -34,7 +37,7 @@ int main(int argc, char **argv)
         fprintf(stderr, "failed to convert ff02::1:3 to an address\n");
         goto die;
     }
-    mreq.ipv6mr_interface = if_nametoindex("br0");
+    mreq.ipv6mr_interface = if_nametoindex("wlan0");
 
     err = setsockopt(sock6, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
                      sizeof(struct ipv6_mreq));
@@ -55,16 +58,35 @@ int main(int argc, char **argv)
     }
 
     while(true) {
-        msg_len = read(sock6, buf, 1024);
-
+        peer_addr_len = sizeof(struct sockaddr_storage);
+        msg_len = recvfrom(sock6, buf, 1024, 0,
+                           (struct sockaddr *)&peer_addr, &peer_addr_len);
         if (msg_len == -1) {
             perror("receiving data");
-            goto die;
+            continue;
+        }
+
+        buf[2] |= 0x10; /* We're a reply, honest! */
+
+        err = getnameinfo((struct sockaddr *)&peer_addr, peer_addr_len,
+                          host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV);
+
+        if (err == 0) {
+            printf("Got %ld bytes from %s:%s\n", (long) msg_len,
+                   host, service);
+        } else {
+            fprintf(stderr, "getnameinfo: %s\n", gai_strerror(err));
+            continue;
         }
 
-        buf[msg_len] = '\0';
+        if(sendto(sock6, buf, msg_len, 0,
+                  (struct sockaddr *)&peer_addr, peer_addr_len) != msg_len) {
+            perror("sending reply");
+            goto die;
+        } else {
+            printf("Sent %ld bytes back\n", (long) msg_len);
+        }
 
-        printf("--> %s\n", buf);
     }
 
     close(sock6);
index de49e17..8ca2927 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -9,14 +9,27 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
-#define DATA "Mu..mu..multicast!"
 
 int main(int argc, char **argv)
 {
     int err;
     int sock6;
-    int idx = if_nametoindex("br0");
+    int idx = if_nametoindex("wlan0");
     struct addrinfo hints, *ai, *pai;
+    uint8_t data[] = {
+        0x17, 0x2a, /* id */
+        0x00, 0x00, /* flags */
+        0x00, 0x01, /* 1 question (big endian) */
+        0x00, 0x00, /* 0 answers */
+        0x00, 0x00, /* 0 authority records */
+        0x00, 0x00, /* 0 additional records */
+        0x06, /* size of string 'franky' */
+        'f', 'r', 'a', 'n', 'k', 'y', 0x00, /* string with terminator */
+        0x00, 0x1c, /* AAAA record */
+        0x00, 0x01 /* IN class */
+    };
+    uint8_t reply[1024];
+    ssize_t nread;
 
     memset(&hints, 0, sizeof(struct addrinfo));
     hints.ai_family = AF_INET6;
@@ -56,8 +69,14 @@ int main(int argc, char **argv)
 
     freeaddrinfo(ai);
 
-    if (write(sock6, DATA, strlen(DATA) + 1) != strlen(DATA) + 1) {
-        perror("writing " DATA);
+    if (write(sock6, data, sizeof(data)) != sizeof(data)) {
+        perror("writing data");
+        exit(1);
+    }
+
+    nread = read(sock6, reply, 1024);
+    if (nread == -1) {
+        perror("reading reply");
         exit(1);
     }