git.samba.org
/
kai
/
multicast.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a239e44
)
Switch to sending LLMNR packets
author
Kai Blin
<kai@samba.org>
Sun, 15 May 2011 18:13:03 +0000
(20:13 +0200)
committer
Kai Blin
<kai@samba.org>
Sun, 15 May 2011 18:13:03 +0000
(20:13 +0200)
listener.c
patch
|
blob
|
history
sender.c
patch
|
blob
|
history
diff --git
a/listener.c
b/listener.c
index 5276351edd5046fdabbba0d342b89ffb3c2d20b2..6a751828886b6b8f0ce832ab9745d04f8bca8443 100644
(file)
--- a/
listener.c
+++ b/
listener.c
@@
-18,9
+18,12
@@
int main(int argc, char **argv)
int sock6 = -1;
struct sockaddr_in6 name6;
ssize_t len6 = sizeof(name6);
int sock6 = -1;
struct sockaddr_in6 name6;
ssize_t len6 = sizeof(name6);
+ struct sockaddr_storage peer_addr;
struct ipv6_mreq mreq;
struct ipv6_mreq mreq;
-
char
buf[1024];
+
uint8_t
buf[1024];
ssize_t msg_len;
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) {
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;
}
fprintf(stderr, "failed to convert ff02::1:3 to an address\n");
goto die;
}
- mreq.ipv6mr_interface = if_nametoindex("
br
0");
+ mreq.ipv6mr_interface = if_nametoindex("
wlan
0");
err = setsockopt(sock6, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
sizeof(struct ipv6_mreq));
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) {
}
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");
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);
}
close(sock6);
diff --git
a/sender.c
b/sender.c
index de49e1740c3b99718d4dba4afb21077ed0ecc06b..8ca2927492d5526ee121a19c8d035f893a269f74 100644
(file)
--- a/
sender.c
+++ b/
sender.c
@@
-9,14
+9,27
@@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#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 main(int argc, char **argv)
{
int err;
int sock6;
- int idx = if_nametoindex("
br
0");
+ int idx = if_nametoindex("
wlan
0");
struct addrinfo hints, *ai, *pai;
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;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET6;
@@
-56,8
+69,14
@@
int main(int argc, char **argv)
freeaddrinfo(ai);
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);
}
exit(1);
}