Reading the ARP cache table

Discussion in 'Linux Networking' started by Ramy Asselin, Dec 4, 2003.

  1. Ramy Asselin

    Ramy Asselin Guest

    I would like to read the ARP cache table programatically using Linux.

    In Stevens Unix Network Programming Vol 1, he uses the sysctl function to
    access the ARP cache entries.
    But I can't find the required constants NET_RT_FLAGS AND RT_LLINFO! :(

    Thanks!
    Ramy

    P.S. I found code that does this in ~FreeBSD~

    <http://unix.derkeiler.com/Mailing-Lists/FreeBSD/net/2003-08/0133.html>

    #include <sys/file.h>
    #include <sys/socket.h>
    #include <sys/sysctl.h>
    #include <net/if_dl.h>
    #include <net/route.h>
    #include <netinet/in.h>
    #include <netinet/if_ether.h>
    #include <arpa/inet.h>
    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>


    #define ROUNDUP(a) \
    ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
    int
    main(int argc, char *argv[])
    {
    int mib[6];
    size_t needed;
    char *lim, *buf, *next;
    if (argc != 1) {
    (void)fprintf(stderr, "Usage: %s\n", argv[0]);
    exit(1);
    }


    mib[0] = CTL_NET;
    mib[1] = PF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_INET;
    mib[4] = NET_RT_FLAGS;
    mib[5] = RTF_LLINFO;
    if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
    errx(1, "route-sysctl-estimate");
    if ((buf = malloc(needed)) == NULL)
    errx(1, "malloc");
    if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
    errx(1, "actual retrieval of routing table");


    lim = buf + needed;
    next = buf;
    while (next < lim) {
    struct rt_msghdr *rtm = (struct rt_msghdr *)next;
    struct sockaddr_inarp *sinarp = (struct sockaddr_inarp
    *)(rtm + 1);
    struct sockaddr_dl *sdl =
    (struct sockaddr_dl *)((char *)sinarp +
    ROUNDUP(sinarp->sin_len));
    if (sdl->sdl_alen) { /* complete ARP entry */
    printf("%s at ", inet_ntoa(sinarp->sin_addr));
    printf("%s", ether_ntoa((struct ether_addr
    *)LLADDR(sdl)));
    printf("\n");
    }
    next += rtm->rtm_msglen;
    }
    free(buf);
    return(0);
    }
     
    Ramy Asselin, Dec 4, 2003
    #1
    1. Advertisements

  2. Ramy Asselin

    Jim Fischer Guest

    A good place to start would be the source code for the arp(8) program
    itself. On Linux boxes, the arp(8) program is usually installed via the
    'net-tools' package. Here's a Freshmeat page for the 'net-tools' stuff:

    http://freshmeat.net/projects/net-tools/?topic_id=150
     
    Jim Fischer, Dec 5, 2003
    #2
    1. Advertisements

  3. Ramy Asselin

    Leon. Guest

    A way to get started is to run 'strace arp '.
    You can then see the system calls the arp command makes.

    Or you can get the source code to the arp command.
     
    Leon., Dec 5, 2003
    #3
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.