Mercurial > hg > toybox
annotate toys/pending/arping.c @ 1349:bf2e5591bdf0 draft
Cleanup strings.
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 11 Jun 2014 08:02:55 -0500 |
parents | 0ecfaa7022e8 |
children | 6db5787d340b |
rev | line source |
---|---|
1165
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* arping - send ARP REQUEST to a neighbour host. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
8 USE_ARPING(NEWTOY(arping, "<1>1s:I:w#<0c#<0AUDbqf[+AU][+Df]", TOYFLAG_USR|TOYFLAG_SBIN)) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
9 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 config ARPING |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 bool "arping" |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 default n |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 help |
1265
0ecfaa7022e8
usage: is lower case (the help generator looks for that, might as well be consistent).
Rob Landley <rob@landley.net>
parents:
1165
diff
changeset
|
14 usage: arping [-fqbDUA] [-c CNT] [-w TIMEOUT] [-I IFACE] [-s SRC_IP] DST_IP |
1165
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
15 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
16 Send ARP requests/replies |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 -f Quit on first ARP reply |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 -q Quiet |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 -b Keep broadcasting, don't go unicast |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 -D Duplicated address detection mode |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 -U Unsolicited ARP mode, update your neighbors |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 -A ARP answer mode, update your neighbors |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 -c N Stop after sending N ARP requests |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
25 -w TIMEOUT Time to wait for ARP reply, seconds |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 -I IFACE Interface to use (default eth0) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 -s SRC_IP Sender IP address |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 DST_IP Target IP address |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 */ |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 #define FOR_arping |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
31 #include "toys.h" |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 #include <netinet/ether.h> |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 #include <netpacket/packet.h> |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 GLOBALS( |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 long count; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 unsigned long time_out; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 char *iface; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 char *src_ip; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 int sockfd; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 unsigned start; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 unsigned end; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 unsigned sent_at; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 unsigned sent_nr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 unsigned rcvd_nr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 unsigned brd_sent; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 unsigned rcvd_req; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 unsigned brd_rcv; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 unsigned unicast_flag; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 ) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 struct sockaddr_ll src_pk, dst_pk; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 struct in_addr src_addr, dest_addr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 extern void *mempcpy(void *dest, const void *src, size_t n); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 // Gets information of INTERFACE and updates IFINDEX, MAC and IP. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 static void get_interface(char *interface, int *ifindex, uint32_t *oip, |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 uint8_t *mac) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 struct ifreq req; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 struct sockaddr_in *ip; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 int fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 req.ifr_addr.sa_family = AF_INET; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 strncpy(req.ifr_name, interface, IFNAMSIZ); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 req.ifr_name[IFNAMSIZ-1] = '\0'; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 xioctl(fd, SIOCGIFFLAGS, &req); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 if (!(req.ifr_flags & IFF_UP)) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 if (oip) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 xioctl(fd, SIOCGIFADDR, &req); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 ip = (struct sockaddr_in*) &req.ifr_addr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 *oip = ntohl(ip->sin_addr.s_addr); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 if (ifindex) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 xioctl(fd, SIOCGIFINDEX, &req); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 *ifindex = req.ifr_ifindex; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 if (mac) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 xioctl(fd, SIOCGIFHWADDR, &req); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 memcpy(mac, req.ifr_hwaddr.sa_data, 6); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 xclose(fd); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 // SIGINT handler, Print Number of Packets send or receive details. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 static void done(int sig) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 if (!(toys.optflags & FLAG_q)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 xprintf("Sent %u probe(s) (%u broadcast(s))\n", TT.sent_nr, TT.brd_sent); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 xprintf("Received %u repl%s (%u request(s), %u broadcast(s))\n", |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 TT.rcvd_nr, TT.rcvd_nr == 1 ? "y":"ies", TT.rcvd_req, TT.brd_rcv); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 if (toys.optflags & FLAG_D) exit(!!TT.rcvd_nr); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 //In -U mode, No reply is expected. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
98 if (toys.optflags & FLAG_U) exit(EXIT_SUCCESS); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
99 exit(!TT.rcvd_nr); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
100 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
101 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
102 // Create and Send Packet |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
103 static void send_packet() |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
104 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
105 int ret; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
106 unsigned char sbuf[256] = {0,}; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
107 struct arphdr *arp_h = (struct arphdr *) sbuf; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
108 unsigned char *ptr = (unsigned char *)(arp_h + 1); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
109 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
110 arp_h->ar_hrd = htons(ARPHRD_ETHER); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
111 arp_h->ar_pro = htons(ETH_P_IP); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
112 arp_h->ar_hln = src_pk.sll_halen; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
113 arp_h->ar_pln = 4; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
114 arp_h->ar_op = (toys.optflags & FLAG_A) ? htons(ARPOP_REPLY) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
115 : htons(ARPOP_REQUEST); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
116 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
117 ptr = mempcpy(ptr, &src_pk.sll_addr, src_pk.sll_halen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
118 ptr = mempcpy(ptr, &src_addr, 4); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
119 if (toys.optflags & FLAG_A) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
120 ptr = mempcpy(ptr, &src_pk.sll_addr, src_pk.sll_halen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
121 else ptr = mempcpy(ptr, &dst_pk.sll_addr, src_pk.sll_halen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
122 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
123 ptr = mempcpy(ptr, &dest_addr, 4); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
124 ret = sendto(TT.sockfd, sbuf, ptr - sbuf, 0, |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
125 (struct sockaddr *)&dst_pk, sizeof(dst_pk)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
126 if (ret == ptr - sbuf) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
127 struct timeval tval; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
128 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
129 gettimeofday(&tval, NULL); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
130 TT.sent_at = (tval.tv_sec * 1000000ULL + (tval.tv_usec)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
131 TT.sent_nr++; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
132 if (!TT.unicast_flag) TT.brd_sent++; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
133 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
134 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
135 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
136 // Receive Packet and filter with valid checks. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
137 static void recv_from(struct sockaddr_ll *from, int *recv_len) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
138 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
139 struct in_addr s_ip, d_ip; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
140 struct arphdr *arp_hdr = (struct arphdr *)toybuf; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
141 unsigned char *p = (unsigned char *)(arp_hdr + 1); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
142 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
143 if (arp_hdr->ar_op != htons(ARPOP_REQUEST) && |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
144 arp_hdr->ar_op != htons(ARPOP_REPLY)) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
145 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
146 if (from->sll_pkttype != PACKET_HOST && from->sll_pkttype != PACKET_BROADCAST |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
147 && from->sll_pkttype != PACKET_MULTICAST) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
148 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
149 if (arp_hdr->ar_pro != htons(ETH_P_IP) || (arp_hdr->ar_pln != 4) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
150 || (arp_hdr->ar_hln != src_pk.sll_halen) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
151 || (*recv_len < (int)(sizeof(*arp_hdr) + 2 * (4 + arp_hdr->ar_hln)))) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
152 return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
153 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
154 memcpy(&s_ip.s_addr, p + arp_hdr->ar_hln, 4); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
155 memcpy(&d_ip.s_addr, p + arp_hdr->ar_hln + 4 + arp_hdr->ar_hln, 4); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
156 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
157 if (dest_addr.s_addr != s_ip.s_addr) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
158 if (toys.optflags & FLAG_D) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
159 if (src_addr.s_addr && src_addr.s_addr != d_ip.s_addr) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
160 if (!memcmp(p, &src_pk.sll_addr, src_pk.sll_halen)) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
161 } else if (src_addr.s_addr != d_ip.s_addr ) return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
162 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
163 if (!(toys.optflags & FLAG_q)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
164 printf("%scast re%s from %s [%s]", |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
165 from->sll_pkttype == PACKET_HOST ? "Uni" : "Broad", |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
166 arp_hdr->ar_op == htons(ARPOP_REPLY) ? "ply" : "quest", |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
167 inet_ntoa(s_ip), ether_ntoa((struct ether_addr *) p)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
168 if (TT.sent_at) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
169 unsigned delta; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
170 struct timeval tval; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
171 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
172 gettimeofday(&tval, NULL); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
173 delta = (tval.tv_sec * 1000000ULL + (tval.tv_usec)) - TT.sent_at; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
174 xprintf(" %u.%03ums\n", delta / 1000, delta % 1000); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
175 xflush(); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
176 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
177 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
178 TT.rcvd_nr++; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
179 if (from->sll_pkttype != PACKET_HOST) TT.brd_rcv++; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
180 if (arp_hdr->ar_op == htons(ARPOP_REQUEST)) TT.rcvd_req++; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
181 if (toys.optflags & FLAG_f) done(0); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
182 if (!(toys.optflags & FLAG_b)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
183 memcpy(dst_pk.sll_addr, p, src_pk.sll_halen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
184 TT.unicast_flag = 1; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
185 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
186 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
187 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
188 // Alarm signal Handle, send packets in one second interval. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
189 static void send_signal(int sig) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
190 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
191 struct timeval start; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
192 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
193 gettimeofday(&start, NULL); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
194 if (!TT.start) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
195 TT.end = TT.start = start.tv_sec * 1000 + start.tv_usec / 1000; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
196 else TT.end = start.tv_sec*1000 + start.tv_usec / 1000; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
197 if (toys.optflags & FLAG_c) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
198 if (!TT.count) done(0); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
199 TT.count--; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
200 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
201 if ((toys.optflags & FLAG_w) && ((TT.end - TT.start) > |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
202 ((TT.time_out)*1000))) done(0); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
203 send_packet(); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
204 alarm(1); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
205 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
206 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
207 void arping_main(void) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
208 { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
209 struct ifreq ifr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
210 struct sockaddr_ll from; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
211 socklen_t len; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
212 int if_index, recv_len; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
213 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
214 if (!(toys.optflags & FLAG_I)) TT.iface = "eth0"; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
215 TT.sockfd = xsocket(AF_PACKET, SOCK_DGRAM, 0); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
216 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
217 memset(&ifr, 0, sizeof(ifr)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
218 strncpy(ifr.ifr_name, TT.iface, IFNAMSIZ); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
219 get_interface(TT.iface, &if_index, NULL, NULL); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
220 src_pk.sll_ifindex = if_index; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
221 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
222 xioctl(TT.sockfd, SIOCGIFFLAGS, (char*)&ifr); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
223 if (!(ifr.ifr_flags & IFF_UP) && !(toys.optflags & FLAG_q)) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
224 error_exit("Interface \"%s\" is down", TT.iface); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
225 if ((ifr.ifr_flags & (IFF_NOARP | IFF_LOOPBACK)) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
226 && !(toys.optflags & FLAG_q)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
227 xprintf("Interface \"%s\" is not ARPable\n", TT.iface); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
228 toys.exitval = (toys.optflags & FLAG_D) ? 0 : 2; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
229 return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
230 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
231 if (!inet_aton(*toys.optargs, &dest_addr)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
232 struct hostent *hp = gethostbyname2(*toys.optargs, AF_INET); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
233 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
234 if (!hp) perror_exit("bad address '%s'", *toys.optargs); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
235 memcpy(&dest_addr, hp->h_addr, 4); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
236 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
237 if ((toys.optflags & FLAG_s) && !(inet_aton(TT.src_ip, &src_addr))) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
238 perror_exit("invalid source address '%s'",TT.src_ip); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
239 if (!(toys.optflags & FLAG_D) && (toys.optflags & FLAG_U) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
240 && !src_addr.s_addr) src_addr = dest_addr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
241 if (!(toys.optflags & FLAG_D) || src_addr.s_addr) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
242 struct sockaddr_in saddr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
243 int p_fd = xsocket(AF_INET, SOCK_DGRAM, 0); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
244 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
245 if (setsockopt(p_fd, SOL_SOCKET, SO_BINDTODEVICE, TT.iface, |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
246 strlen(TT.iface))) perror_exit("setsockopt"); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
247 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
248 memset(&saddr, 0, sizeof(saddr)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
249 saddr.sin_family = AF_INET; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
250 if (src_addr.s_addr) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
251 saddr.sin_addr = src_addr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
252 if (bind(p_fd, (struct sockaddr*)&saddr, sizeof(saddr))) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
253 perror_exit("bind"); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
254 } else { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
255 uint32_t oip; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
256 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
257 saddr.sin_port = htons(1025); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
258 saddr.sin_addr = dest_addr; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
259 if (connect(p_fd, (struct sockaddr *) &saddr, sizeof(saddr))) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
260 perror_exit("cannot connect to remote host"); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
261 get_interface(TT.iface, NULL, &oip, NULL); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
262 src_addr.s_addr = htonl(oip); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
263 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
264 xclose(p_fd); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
265 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
266 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
267 src_pk.sll_family = AF_PACKET; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
268 src_pk.sll_protocol = htons(ETH_P_ARP); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
269 if (bind(TT.sockfd, (struct sockaddr *)&src_pk, sizeof(src_pk))) |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
270 perror_exit("bind"); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
271 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
272 socklen_t alen = sizeof(src_pk); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
273 getsockname(TT.sockfd, (struct sockaddr *)&src_pk, &alen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
274 if (!src_pk.sll_halen) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
275 perror_msg("src is not arpable"); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
276 toys.exitval = (toys.optflags & FLAG_D) ? 0 : 2; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
277 return; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
278 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
279 if (!(toys.optflags & FLAG_q)) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
280 xprintf("ARPING to %s", inet_ntoa(dest_addr)); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
281 xprintf(" from %s via %s\n", inet_ntoa(src_addr), TT.iface); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
282 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
283 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
284 dst_pk = src_pk; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
285 //First packet always broadcasts. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
286 memset(dst_pk.sll_addr, -1, dst_pk.sll_halen); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
287 signal(SIGINT, done); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
288 signal(SIGALRM, send_signal); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
289 |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
290 send_signal(0); // Send first Broadcast message. |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
291 while (1) { |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
292 len = sizeof(from); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
293 recv_len = recvfrom(TT.sockfd, toybuf, 4096, 0, |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
294 (struct sockaddr *)&from, &len); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
295 if (recv_len < 0) continue; |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
296 recv_from(&from, &recv_len); |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
297 } |
3c438a08d1fb
arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
298 } |