]> The Tcpdump Group git mirrors - libpcap/commitdiff
Pass IFF_ flags to add_addr_to_iflist().
authorGuy Harris <[email protected]>
Thu, 19 Jan 2017 04:39:03 +0000 (20:39 -0800)
committerGuy Harris <[email protected]>
Thu, 19 Jan 2017 04:39:03 +0000 (20:39 -0800)
It's only used on UN*Xes, so it's only used on systems that have IFF_
flags; have add_addr_to_iflist() do the mapping to PCAP_IF_ flags.

That restores the workaround for systems lacking IFF_LOOPBACK and the
"don't even try" for systems lacking IFF_UP or IFF_RUNNING.

fad-getad.c
fad-gifc.c
fad-glifc.c
pcap-int.h
pcap-linux.c
pcap.c

index a4625dfd7ec485b0702068ff4df594b7c737f18f..0e52b0be94efc8ba497ccdd6b0436bef2e329395 100644 (file)
@@ -264,8 +264,7 @@ pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
                /*
                 * Add information for this address to the list.
                 */
-               if (add_addr_to_iflist(devlistp, ifa->ifa_name,
-                   if_flags_to_pcap_flags(ifa->ifa_name, ifa->ifa_flags),
+               if (add_addr_to_iflist(devlistp, ifa->ifa_name, ifa->ifa_flags,
                    addr, addr_size, netmask, addr_size,
                    broadaddr, broadaddr_size, dstaddr, dstaddr_size,
                    errbuf) < 0) {
index d431ba162d0b654fa989180ad05b1473e12bace0..4079fc2f63c7bfe4478f4892242e400e4d4c256d 100644 (file)
@@ -401,7 +401,7 @@ pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
                 * Add information for this address to the list.
                 */
                if (add_addr_to_iflist(devlistp, ifrp->ifr_name,
-                   if_flags_to_pcap_flags(ifrp->ifr_name, ifrflags.ifr_flags),
+                   ifrflags.ifr_flags,
                    &ifrp->ifr_addr, SA_LEN(&ifrp->ifr_addr),
                    netmask, netmask_size, broadaddr, broadaddr_size,
                    dstaddr, dstaddr_size, errbuf) < 0) {
index e53bad76c27b1361b7e3c7098367297cfb5d9ae5..cc895c28640e48e9633b6c26c6b3dcc949718713 100644 (file)
@@ -329,7 +329,7 @@ pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
                 * Add information for this address to the list.
                 */
                if (add_addr_to_iflist(devlistp, ifrp->lifr_name,
-                   if_flags_to_pcap_flags(ifrp->lifr_name, ifrflags.lifr_flags),
+                   ifrflags.lifr_flags,
                    (struct sockaddr *)&ifrp->lifr_addr,
                    sizeof (struct sockaddr_storage),
                    netmask, sizeof (struct sockaddr_storage),
index b5fc8ea3dc34aae4e3fd41335ce945f088d643af..f9321bc30140ec264e616762eacb9ab1e67ddf93 100644 (file)
@@ -435,7 +435,6 @@ int add_addr_to_dev(pcap_if_t *, struct sockaddr *, size_t,
            struct sockaddr *, size_t, struct sockaddr *, size_t,
            struct sockaddr *dstaddr, size_t, char *errbuf);
 #ifndef _WIN32
-bpf_u_int32 if_flags_to_pcap_flags(const char *, u_int);
 int    add_addr_to_iflist(pcap_if_list_t *, const char *, bpf_u_int32,
            struct sockaddr *, size_t, struct sockaddr *, size_t,
            struct sockaddr *, size_t, struct sockaddr *, size_t, char *);
index d48fb8c3227f468ad6855380f9f699d86dccf804..2d68539c1784907bd032e2405e1c570e81a48df8 100644 (file)
@@ -2290,8 +2290,7 @@ add_linux_if(pcap_if_list_t *devlistp, const char *ifname, int fd, char *errbuf)
         * Add an entry for this interface, with no addresses, if it's
         * not already in the list.
         */
-       if (find_or_add_dev(devlistp, name,
-           if_flags_to_pcap_flags(name, ifrflags.ifr_flags), NULL,
+       if (find_or_add_dev(devlistp, name, ifrflags.ifr_flags, NULL,
            errbuf) == NULL) {
                /*
                 * Failure.
diff --git a/pcap.c b/pcap.c
index 9c2a2fac752ac6a761343d8b6fa6aba2c867391e..7a466fc2eed879add7768d189aed7dbb6678d23e 100644 (file)
--- a/pcap.c
+++ b/pcap.c
@@ -408,46 +408,6 @@ pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
        return (0);
 }
 
-#ifndef _WIN32
-/* Not all systems have IFF_LOOPBACK */
-#ifdef IFF_LOOPBACK
-#define ISLOOPBACK(name, flags) ((flags) & IFF_LOOPBACK)
-#else
-#define ISLOOPBACK(name, flags) ((name)[0] == 'l' && (name)[1] == 'o' && \
-    (isdigit((unsigned char)((name)[2])) || (name)[2] == '\0'))
-#endif
-
-#ifdef IFF_UP
-#define ISUP(flags) ((flags) & IFF_UP)
-#else
-#define ISUP(flags) 0
-#endif
-
-#ifdef IFF_RUNNING
-#define ISRUNNING(flags) ((flags) & IFF_RUNNING)
-#else
-#define ISRUNNING(flags) 0
-#endif
-
-/*
- * Map UN*X-style interface flags to libpcap flags.
- */
-bpf_u_int32
-if_flags_to_pcap_flags(const char *name _U_, u_int if_flags)
-{
-       bpf_u_int32 pcap_flags;
-
-       pcap_flags = 0;
-       if (if_flags & IFF_LOOPBACK)
-               pcap_flags |= PCAP_IF_LOOPBACK;
-       if (if_flags & IFF_UP)
-               pcap_flags |= PCAP_IF_UP;
-       if (if_flags & IFF_RUNNING)
-               pcap_flags |= PCAP_IF_RUNNING;
-       return (pcap_flags);
-}
-#endif
-
 static struct sockaddr *
 dup_sockaddr(struct sockaddr *sa, size_t sa_length)
 {
@@ -695,7 +655,7 @@ get_if_description(const char *name)
  * the list of addresses for the device and return 0.
  *
  * If we don't find it, attempt to add an entry for it, with the specified
- * flags and description, and, if that succeeds, add the specified
+ * IFF_ flags and description, and, if that succeeds, add the specified
  * address to its list of addresses if that address is non-null, and
  * return 0, otherwise return -1 and set errbuf to an error message.
  *
@@ -707,7 +667,8 @@ get_if_description(const char *name)
  * add interfaces even if they have no addresses.)
  */
 int
-add_addr_to_iflist(pcap_if_list_t *alldevs, const char *name, bpf_u_int32 flags,
+add_addr_to_iflist(pcap_if_list_t *alldevs, const char *name,
+    bpf_u_int32 if_flags,
     struct sockaddr *addr, size_t addr_size,
     struct sockaddr *netmask, size_t netmask_size,
     struct sockaddr *broadaddr, size_t broadaddr_size,
@@ -715,13 +676,39 @@ add_addr_to_iflist(pcap_if_list_t *alldevs, const char *name, bpf_u_int32 flags,
     char *errbuf)
 {
        pcap_if_t *curdev;
+       bpf_u_int32 pcap_flags;
+
+       /*
+        * Convert IFF_ flags to pcap flags.
+        */
+       pcap_flags = 0;
+#ifdef IFF_LOOPBACK
+       if (if_flags & IFF_LOOPBACK)
+               pcap_flags |= PCAP_IF_LOOPBACK;
+#else
+       /*
+        * We don't have IFF_LOOPBACK, so look at the device name to
+        * see if it looks like a loopback device.
+        */
+       if (name[0] == 'l' && name[1] == 'o' &&
+           (isdigit((unsigned char)(name[2])) || name[2] == '\0')
+               pcap_flags |= PCAP_IF_LOOPBACK;
+#endif
+#ifdef IFF_UP
+       if (if_flags & IFF_UP)
+               pcap_flags |= PCAP_IF_UP;
+#endif
+#ifdef IFF_RUNNING
+       if (if_flags & IFF_RUNNING)
+               pcap_flags |= PCAP_IF_RUNNING;
+#endif
 
        /*
         * Attempt to find an entry for this device; if we don't find one,
         * attempt to add one.
         */
-       curdev = find_or_add_dev(alldevs, name, flags, get_if_description(name),
-           errbuf);
+       curdev = find_or_add_dev(alldevs, name, pcap_flags,
+           get_if_description(name), errbuf);
        if (curdev == NULL) {
                /*
                 * Error - give up.