gzip cleanup part #8
[oweals/busybox.git] / networking / udhcp / arpping.c
index f2e3768c555b8184c7d961519852de4002b059b5..f78fd3fd829a69e0256de6584602a44752ddf2a7 100644 (file)
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
 /*
  * arpping.c
  *
@@ -5,35 +6,45 @@
  * by Yoichi Hariguchi <yoichi@fore.com>
  */
 
-#include <sys/time.h>
-#include <time.h>
-#include <sys/socket.h>
 #include <netinet/if_ether.h>
 #include <net/if_arp.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
 
-#include "dhcpd.h"
-#include "arpping.h"
 #include "common.h"
+#include "dhcpd.h"
+
+
+struct arpMsg {
+       /* Ethernet header */
+       uint8_t  h_dest[6];                     /* destination ether addr */
+       uint8_t  h_source[6];                   /* source ether addr */
+       uint16_t h_proto;                       /* packet type ID field */
+
+       /* ARP packet */
+       uint16_t htype;                         /* hardware type (must be ARPHRD_ETHER) */
+       uint16_t ptype;                         /* protocol type (must be ETH_P_IP) */
+       uint8_t  hlen;                          /* hardware address length (must be 6) */
+       uint8_t  plen;                          /* protocol address length (must be 4) */
+       uint16_t operation;                     /* ARP opcode */
+       uint8_t  sHaddr[6];                     /* sender's hardware address */
+       uint8_t  sInaddr[4];                    /* sender's IP address */
+       uint8_t  tHaddr[6];                     /* target's hardware address */
+       uint8_t  tInaddr[4];                    /* target's IP address */
+       uint8_t  pad[18];                       /* pad for min. Ethernet payload (60 bytes) */
+} ATTRIBUTE_PACKED;
 
 /* args:       yiaddr - what IP to ping
  *             ip - our ip
  *             mac - our arp address
  *             interface - interface to use
- * retn:       1 addr free
+ * retn:       1 addr free
  *             0 addr used
- *             -1 error 
- */  
+ *             -1 error
+ */
 
 /* FIXME: match response against chaddr */
 int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
 {
-
        int     timeout = 2;
-       int     optval = 1;
        int     s;                      /* socket */
        int     rv = 1;                 /* return value */
        struct sockaddr addr;           /* for interface name */
@@ -43,26 +54,23 @@ int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
        time_t          prevTime;
 
 
-       if ((s = socket (PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP))) == -1) {
-#ifdef IN_BUSYBOX
-               LOG(LOG_ERR, bb_msg_can_not_create_raw_socket);
-#else
-               LOG(LOG_ERR, "Could not open raw socket");
-#endif
+       s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));
+       if (s == -1) {
+               bb_perror_msg(bb_msg_can_not_create_raw_socket);
                return -1;
        }
-       
-       if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) {
-               LOG(LOG_ERR, "Could not setsocketopt on raw socket");
+
+       if (setsockopt_broadcast(s) == -1) {
+               bb_perror_msg("cannot setsocketopt on raw socket");
                close(s);
                return -1;
        }
 
        /* send arp request */
        memset(&arp, 0, sizeof(arp));
-       memcpy(arp.ethhdr.h_dest, MAC_BCAST_ADDR, 6);   /* MAC DA */
-       memcpy(arp.ethhdr.h_source, mac, 6);            /* MAC SA */
-       arp.ethhdr.h_proto = htons(ETH_P_ARP);          /* protocol type (Ethernet) */
+       memcpy(arp.h_dest, MAC_BCAST_ADDR, 6);          /* MAC DA */
+       memcpy(arp.h_source, mac, 6);                   /* MAC SA */
+       arp.h_proto = htons(ETH_P_ARP);                 /* protocol type (Ethernet) */
        arp.htype = htons(ARPHRD_ETHER);                /* hardware type */
        arp.ptype = htons(ETH_P_IP);                    /* protocol type (ARP message) */
        arp.hlen = 6;                                   /* hardware address length */
@@ -71,36 +79,36 @@ int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
        memcpy(arp.sInaddr, &ip, sizeof(ip));           /* source IP address */
        memcpy(arp.sHaddr, mac, 6);                     /* source hardware address */
        memcpy(arp.tInaddr, &yiaddr, sizeof(yiaddr));   /* target IP address */
-       
+
        memset(&addr, 0, sizeof(addr));
        strcpy(addr.sa_data, interface);
        if (sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr)) < 0)
                rv = 0;
-       
+
        /* wait arp reply, and check it */
        tm.tv_usec = 0;
-       time(&prevTime);
+       prevTime = uptime();
        while (timeout > 0) {
                FD_ZERO(&fdset);
                FD_SET(s, &fdset);
                tm.tv_sec = timeout;
                if (select(s + 1, &fdset, (fd_set *) NULL, (fd_set *) NULL, &tm) < 0) {
-                       DEBUG(LOG_ERR, "Error on ARPING request: %m");
+                       bb_perror_msg("error on ARPING request");
                        if (errno != EINTR) rv = 0;
                } else if (FD_ISSET(s, &fdset)) {
                        if (recv(s, &arp, sizeof(arp), 0) < 0 ) rv = 0;
-                       if (arp.operation == htons(ARPOP_REPLY) && 
-                           bcmp(arp.tHaddr, mac, 6) == 0 && 
+                       if (arp.operation == htons(ARPOP_REPLY) &&
+                           memcmp(arp.tHaddr, mac, 6) == 0 &&
                            *((uint32_t *) arp.sInaddr) == yiaddr) {
-                               DEBUG(LOG_INFO, "Valid arp reply receved for this address");
+                               DEBUG("Valid arp reply received for this address");
                                rv = 0;
                                break;
                        }
                }
-               timeout -= time(NULL) - prevTime;
-               time(&prevTime);
+               timeout -= uptime() - prevTime;
+               prevTime = uptime();
        }
        close(s);
-       DEBUG(LOG_INFO, "%salid arp replies for this address", rv ? "No v" : "V");       
+       DEBUG("%salid arp replies for this address", rv ? "No v" : "V");
        return rv;
 }