annotate toys/pending/arping.c @ 1586:6db5787d340b draft

Minor whitespace cleanups.
author Rob Landley <rob@landley.net>
date Sat, 29 Nov 2014 19:07:08 -0600
parents 0ecfaa7022e8
children 41efba077b75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);
1586
6db5787d340b Minor whitespace cleanups.
Rob Landley <rob@landley.net>
parents: 1265
diff changeset
119 ptr = mempcpy(ptr,
6db5787d340b Minor whitespace cleanups.
Rob Landley <rob@landley.net>
parents: 1265
diff changeset
120 (toys.optflags & FLAG_A) ? &src_pk.sll_addr : &dst_pk.sll_addr,
6db5787d340b Minor whitespace cleanups.
Rob Landley <rob@landley.net>
parents: 1265
diff changeset
121 src_pk.sll_halen);
6db5787d340b Minor whitespace cleanups.
Rob Landley <rob@landley.net>
parents: 1265
diff changeset
122 ptr = mempcpy(ptr, &dest_addr, 4);
1165
3c438a08d1fb arping command is implemented.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff changeset
123
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);
1586
6db5787d340b Minor whitespace cleanups.
Rob Landley <rob@landley.net>
parents: 1265
diff changeset
130 TT.sent_at = tval.tv_sec * 1000000ULL + tval.tv_usec;
1165
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 }