]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - misc/arpd.c
Add reference to tc-codel(8) to the SEE ALSO section
[lisovros/iproute2_canprio.git] / misc / arpd.c
index fd8f7ca986051d1960f9cbeed27fc9718cd948f5..dd1de80c0d85925f28d40c6f5b7c716cfab5cfd8 100644 (file)
@@ -16,7 +16,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <netdb.h>
-#include <db41/db_185.h>
+#include <db_185.h>
 #include <sys/ioctl.h>
 #include <sys/poll.h>
 #include <errno.h>
@@ -27,6 +27,7 @@
 #include <time.h>
 #include <signal.h>
 #include <linux/if.h>
+#include <linux/if_ether.h>
 #include <linux/if_arp.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -41,7 +42,7 @@ int resolve_hosts;
 DB     *dbase;
 char   *dbname = "/var/lib/arpd/arpd.db";
 
-int    ifnum;  
+int    ifnum;
 int    *ifvec;
 char   **ifnames;
 
@@ -52,7 +53,7 @@ struct dbkey
 };
 
 #define IS_NEG(x)      (((__u8*)(x))[0] == 0xFF)
-#define NEG_TIME(x)    (((x)[2]<<24)|((x)[3]<<16)|((x)[4]<<8)|(x)[5]) 
+#define NEG_TIME(x)    (((x)[2]<<24)|((x)[3]<<16)|((x)[4]<<8)|(x)[5])
 #define NEG_AGE(x)     ((__u32)time(NULL) - NEG_TIME((__u8*)x))
 #define NEG_VALID(x)   (NEG_AGE(x) < negative_timeout)
 #define NEG_CNT(x)     (((__u8*)(x))[1])
@@ -89,11 +90,13 @@ int negative_timeout = 60;
 int no_kernel_broadcasts;
 int broadcast_rate = 1000;
 int broadcast_burst = 3000;
+int poll_timeout = 30000;
 
 void usage(void)
 {
        fprintf(stderr,
-"Usage: arpd [ -lk ] [ -a N ] [ -b dbase ] [ -f file ] [ interfaces ]\n");
+               "Usage: arpd [ -lkh? ] [ -a N ] [ -b dbase ] [ -B number ]"
+               " [ -f file ] [ -n time ] [-p interval ] [ -R rate ] [ interfaces ]\n");
        exit(1);
 }
 
@@ -179,7 +182,7 @@ int send_probe(int ifindex, __u32 addr)
 {
        struct ifreq ifr;
        struct sockaddr_in dst;
-       int len;
+       socklen_t len;
        unsigned char buf[256];
        struct arphdr *ah = (struct arphdr*)buf;
        unsigned char *p = (unsigned char *)(ah+1);
@@ -227,8 +230,7 @@ int send_probe(int ifindex, __u32 addr)
        memcpy(p, &addr, 4);
        p+=4;
 
-       len = sendto(pset[0].fd, buf, p-buf, 0, (struct sockaddr*)&sll, sizeof(sll));
-       if (len < 0)
+       if (sendto(pset[0].fd, buf, p-buf, 0, (struct sockaddr*)&sll, sizeof(sll)) < 0)
                return -1;
        stats.probes_sent++;
        return 0;
@@ -281,7 +283,7 @@ int respond_to_kernel(int ifindex, __u32 addr, char *lla, int llalen)
 
        addattr_l(&req.n, sizeof(req), NDA_DST, &addr, 4);
        addattr_l(&req.n, sizeof(req), NDA_LLADDR, lla, llalen);
-       return rtnl_send(&rth, (char*)&req, req.n.nlmsg_len) <= 0;
+       return rtnl_send(&rth, &req, req.n.nlmsg_len) <= 0;
 }
 
 void prepare_neg_entry(__u8 *ndata, __u32 stamp)
@@ -328,7 +330,6 @@ int do_one_request(struct nlmsghdr *n)
            !(ndm->ndm_state&~NUD_NOARP))
                return 0;
 
-       memset(tb, 0, sizeof(tb));
        parse_rtattr(tb, NDA_MAX, NDA_RTA(ndm), len);
 
        if (!tb[NDA_DST])
@@ -480,13 +481,14 @@ void get_arp_pkt(void)
 {
        unsigned char buf[1024];
        struct sockaddr_ll sll;
-       int sll_len = sizeof(sll);
+       socklen_t sll_len = sizeof(sll);
        struct arphdr *a = (struct arphdr*)buf;
        struct dbkey key;
        DBT dbkey, dbdat;
        int n;
 
-       n = recvfrom(pset[0].fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sll, &sll_len);
+       n = recvfrom(pset[0].fd, buf, sizeof(buf), MSG_DONTWAIT,
+                    (struct sockaddr*)&sll, &sll_len);
        if (n < 0) {
                if (errno != EINTR && errno != EAGAIN)
                        syslog(LOG_ERR, "recvfrom: %m");
@@ -510,7 +512,7 @@ void get_arp_pkt(void)
        key.iface = sll.sll_ifindex;
        memcpy(&key.addr, (char*)(a+1) + a->ar_hln, 4);
 
-       /* DAD message, ignore. */ 
+       /* DAD message, ignore. */
        if (key.addr == 0)
                return;
 
@@ -538,7 +540,7 @@ void catch_signal(int sig, void (*handler)(int))
        sa.sa_handler = handler;
 #ifdef SA_INTERRUPT
        sa.sa_flags = SA_INTERRUPT;
-#endif 
+#endif
        sigaction(sig, &sa, NULL);
 }
 
@@ -591,7 +593,7 @@ int main(int argc, char **argv)
        int do_list = 0;
        char *do_load = NULL;
 
-       while ((opt = getopt(argc, argv, "h?b:lf:a:n:kR:B:")) != EOF) {
+       while ((opt = getopt(argc, argv, "h?b:lf:a:n:p:kR:B:")) != EOF) {
                switch (opt) {
                case 'b':
                        dbname = optarg;
@@ -615,6 +617,12 @@ int main(int argc, char **argv)
                case 'k':
                        no_kernel_broadcasts = 1;
                        break;
+               case 'p':
+                       if ((poll_timeout = 1000 * strtod(optarg, NULL)) < 100) {
+                               fprintf(stderr,"Invalid poll timeout\n");
+                               exit(-1);
+                       }
+                       break;
                case 'R':
                        if ((broadcast_rate = atoi(optarg)) <= 0 ||
                            (broadcast_rate = 1000/broadcast_rate) <= 0) {
@@ -708,6 +716,7 @@ int main(int argc, char **argv)
                                fprintf(stderr, "Invalid IP address: \"%s\"\n", ipbuf);
                                goto do_abort;
                        }
+
                        dbdat.data = hexstring_a2n(macbuf, b1, 6);
                        if (dbdat.data == NULL)
                                goto do_abort;
@@ -727,10 +736,10 @@ int main(int argc, char **argv)
                DBT dbkey, dbdat;
                printf("%-8s %-15s %s\n", "#Ifindex", "IP", "MAC");
                while (dbase->seq(dbase, &dbkey, &dbdat, R_NEXT) == 0) {
-                       struct dbkey *key = dbkey.data; 
+                       struct dbkey *key = dbkey.data;
                        if (handle_if(key->iface)) {
                                if (!IS_NEG(dbdat.data)) {
-                                       __u8 b1[18];
+                                       char b1[18];
                                        printf("%-8d %-15s %s\n",
                                               key->iface,
                                               inet_ntoa(*(struct in_addr*)&key->addr),
@@ -774,27 +783,9 @@ int main(int argc, char **argv)
 
        load_initial_table();
 
-       if (1) {
-               int fd;
-               pid_t pid = fork();
-
-               if (pid > 0)
-                       _exit(0);
-               if (pid < 0) {
-                       perror("arpd: fork");
-                       goto do_abort;
-               }
-
-               chdir("/");
-               fd = open("/dev/null", O_RDWR);
-               if (fd >= 0) {
-                       dup2(fd, 0);
-                       dup2(fd, 1);
-                       dup2(fd, 2);
-                       if (fd > 2)
-                               close(fd);
-               }
-               setsid();
+       if (daemon(0, 0)) {
+               perror("arpd: daemon");
+               goto do_abort;
        }
 
        openlog("arpd", LOG_PID | LOG_CONS, LOG_DAEMON);
@@ -824,7 +815,7 @@ int main(int argc, char **argv)
                }
                if (do_stats)
                        send_stats();
-               if (poll(pset, 2, 30000) > 0) {
+               if (poll(pset, 2, poll_timeout) > 0) {
                        in_poll = 0;
                        if (pset[0].revents&EVENTS)
                                get_arp_pkt();