2
* Copyright (C) 2000-2007 SWsoft. All rights reserved.
4
* This code is public domain.
6
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
7
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15
#include <sys/types.h>
18
#include <sys/socket.h>
19
#include <netinet/in.h>
20
#include <linux/types.h>
22
#include <netinet/icmp6.h>
24
#include <sys/ioctl.h>
25
#include <arpa/inet.h>
39
struct in6_addr src_ipaddr;
53
struct in6_addr target;
59
int init_device_addresses(int sock, const char* device)
63
memset(&ifr, 0, sizeof(ifr));
64
strncpy(ifr.ifr_name, device, IFNAMSIZ-1);
66
if (ioctl(sock, SIOCGIFINDEX, &ifr) != 0) {
67
fprintf(stderr, "unknown iface %s : %m", device);
70
ifindex = ifr.ifr_ifindex;
72
/* get interface HW address */
73
if (ioctl(sock, SIOCGIFHWADDR, &ifr) != 0) {
74
fprintf(stderr, "can't get iface '%s' HW address : %m", device);
77
memcpy(real_hwaddr, ifr.ifr_hwaddr.sa_data, 6);
85
void create_nd_packet(struct nd_packet* pkt)
87
pkt->icmp6_type = ND_NEIGHBOR_ADVERT;
95
memcpy(&pkt->target, &src_ipaddr, 16);
96
pkt->otype = ND_OPT_SOURCE_LINKADDR;
98
memcpy(&pkt->obits, real_hwaddr, 6);
103
struct sockaddr_in6 to;
105
to.sin6_family = AF_INET6;
107
((__u32*)&to.sin6_addr)[0] = htonl(0xFF020000);
108
((__u32*)&to.sin6_addr)[1] = 0;
109
((__u32*)&to.sin6_addr)[2] = 0;
110
((__u32*)&to.sin6_addr)[3] = htonl(0x1);
111
to.sin6_scope_id = ifindex;
113
if (sendto(sock, &pkt, sizeof(pkt), 0,
114
(struct sockaddr*) &to, sizeof(to)) < 0) {
115
fprintf(stderr, "sendto : %m");
120
int main(int argc,char** argv)
124
if (inet_pton(AF_INET6, argv[1], &src_ipaddr) <= 0)
128
sock = socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
130
fprintf(stderr, "socket : %m");
134
if (init_device_addresses(sock, iface) < 0)
138
setsockopt (sock, SOL_IPV6, IPV6_MULTICAST_HOPS,
139
&value, sizeof (value));
141
create_nd_packet(&pkt);