1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1994, 1995, 1996, 1997, 1998 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The Regents of the University of California. All rights reserved. 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that the following conditions 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * are met: 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer. 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * documentation and/or other materials provided with the distribution. 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * must display the following acknowledgement: 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This product includes software developed by the Computer Systems 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Engineering Group at Lawrence Berkeley Laboratory. 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 4. Neither the name of the University nor of the Laboratory may be used 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * to endorse or promote products derived from this software without 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * specific prior written permission. 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * SUCH DAMAGE. 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint 36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ = 37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "@(#) $Header: /tcpdump/master/libpcap/fad-getad.c,v 1.10.2.2 2007/09/14 00:45:17 guy Exp $ (LBL)"; 38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h> 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h> 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h> 47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/if.h> 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h> 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h> 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h> 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h> 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ifaddrs.h> 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h" 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef AF_PACKET 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project# ifdef __Lynx__ 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project# include <netpacket/if_packet.h> /* LynxOS */ 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project# else 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project# include <linux/if_packet.h> /* Linux */ 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project# endif 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is fun. 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * In older BSD systems, socket addresses were fixed-length, and 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "sizeof (struct sockaddr)" gave the size of the structure. 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All addresses fit within a "struct sockaddr". 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * In newer BSD systems, the socket address is variable-length, and 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * there's an "sa_len" field giving the length of the structure; 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this allows socket addresses to be longer than 2 bytes of family 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * and 14 bytes of data. 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Some commercial UNIXes use the old BSD scheme, some use the RFC 2553 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * variant of the old BSD scheme (with "struct sockaddr_storage" rather 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * than "struct sockaddr"), and some use the new BSD scheme. 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Some versions of GNU libc use neither scheme, but has an "SA_LEN()" 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * macro that determines the size based on the address family. Other 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * versions don't have "SA_LEN()" (as it was in drafts of RFC 2553 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * but not in the final version). On the latter systems, we explicitly 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * check the AF_ type to determine the length; we assume that on 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * all those systems we have "struct sockaddr_storage". 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef SA_LEN 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SA_LEN(addr) ((addr)->sa_len) 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else /* HAVE_SOCKADDR_SA_LEN */ 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_SOCKADDR_STORAGE 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic size_t 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectget_sa_len(struct sockaddr *addr) 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project switch (addr->sa_family) { 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef AF_INET 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case AF_INET: 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (sizeof (struct sockaddr_in)); 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef AF_INET6 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case AF_INET6: 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (sizeof (struct sockaddr_in6)); 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef AF_PACKET 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case AF_PACKET: 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (sizeof (struct sockaddr_ll)); 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project default: 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (sizeof (struct sockaddr)); 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SA_LEN(addr) (get_sa_len(addr)) 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else /* HAVE_SOCKADDR_STORAGE */ 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SA_LEN(addr) (sizeof (struct sockaddr)) 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_SOCKADDR_STORAGE */ 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_SOCKADDR_SA_LEN */ 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* SA_LEN */ 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get a list of all interfaces that are up and that we can open. 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Returns -1 on error, 0 otherwise. 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The list, as returned through "alldevsp", may be null if no interfaces 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * were up and could be opened. 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is the implementation used on platforms that have "getifaddrs()". 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_findalldevs(pcap_if_t **alldevsp, char *errbuf) 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_if_t *devlist = NULL; 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct ifaddrs *ifap, *ifa; 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct sockaddr *addr, *netmask, *broadaddr, *dstaddr; 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project size_t addr_size, broadaddr_size, dstaddr_size; 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int ret = 0; 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char *p, *q; 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get the list of interface addresses. 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Note: this won't return information about interfaces 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * with no addresses; are there any such interfaces 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that would be capable of receiving packets? 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * (Interfaces incapable of receiving packets aren't 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * very interesting from libpcap's point of view.) 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LAN interfaces will probably have link-layer 158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * addresses; I don't know whether all implementations 159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * of "getifaddrs()" now, or in the future, will return 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * those. 161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (getifaddrs(&ifap) != 0) { 163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "getifaddrs: %s", pcap_strerror(errno)); 165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Is this interface up? 170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!(ifa->ifa_flags & IFF_UP)) { 172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * No, so don't add it to the list. 174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "ifa_addr" was apparently null on at least one 180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface on some system. 181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "ifa_broadaddr" may be non-null even on 183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * non-broadcast interfaces, and was null on 184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * at least one OpenBSD 3.4 system on at least 185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * one interface with IFF_BROADCAST set. 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "ifa_dstaddr" was, on at least one FreeBSD 4.1 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * system, non-null on a non-point-to-point 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface. 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Therefore, we supply the address and netmask only 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * if "ifa_addr" is non-null (if there's no address, 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * there's obviously no netmask), and supply the 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * broadcast and destination addresses if the appropriate 195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * flag is set *and* the appropriate "ifa_" entry doesn't 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * evaluate to a null pointer. 197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifa->ifa_addr != NULL) { 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project addr = ifa->ifa_addr; 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project addr_size = SA_LEN(addr); 201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask = ifa->ifa_netmask; 202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project addr = NULL; 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project addr_size = 0; 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask = NULL; 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifa->ifa_flags & IFF_BROADCAST && 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifa->ifa_broadaddr != NULL) { 209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr = ifa->ifa_broadaddr; 210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr_size = SA_LEN(broadaddr); 211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr = NULL; 213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr_size = 0; 214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifa->ifa_flags & IFF_POINTOPOINT && 216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifa->ifa_dstaddr != NULL) { 217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr = ifa->ifa_dstaddr; 218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr_size = SA_LEN(ifa->ifa_dstaddr); 219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr = NULL; 221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr_size = 0; 222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If this entry has a colon followed by a number at 226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the end, we assume it's a logical interface. Those 227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * are just the way you assign multiple IP addresses to 228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * a real interface on Linux, so an entry for a logical 229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface should be treated like the entry for the 230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * real interface; we do that by stripping off the ":" 231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * and the number. 232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - should we do this only on Linux? 234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p = strchr(ifa->ifa_name, ':'); 236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p != NULL) { 237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We have a ":"; is it followed by a number? 239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project q = p + 1; 241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (isdigit((unsigned char)*q)) 242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project q++; 243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (*q == '\0') { 244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All digits after the ":" until the end. 246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Strip off the ":" and everything after 247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * it. 248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *p = '\0'; 250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Add information for this address to the list. 255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (add_addr_to_iflist(&devlist, ifa->ifa_name, 257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifa->ifa_flags, addr, addr_size, netmask, addr_size, 258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr, broadaddr_size, dstaddr, dstaddr_size, 259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project errbuf) < 0) { 260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project freeifaddrs(ifap); 266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ret != -1) { 268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We haven't had any errors yet; do any platform-specific 270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * operations to add devices. 271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (pcap_platform_finddevs(&devlist, errbuf) < 0) 273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ret == -1) { 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We had an error; free the list we've been constructing. 279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (devlist != NULL) { 281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_freealldevs(devlist); 282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project devlist = NULL; 283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *alldevsp = devlist; 287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (ret); 288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 289