12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Internet, ethernet, port, and protocol string to address 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and address to string conversion routines 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/addrtoname.c,v 1.119 2007-08-08 14:06:34 hannes Exp $ (LBL)"; 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_ETHER_NTOHOST 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_NETINET_IF_ETHER_H 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct mbuf; /* Squelch compiler warnings on some platforms for */ 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct rtentry; /* declarations in <net/if.h> */ 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <net/if.h> /* for "struct ifnet" in "struct arpcom" on Solaris */ 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <netinet/if_ether.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_NETINET_IF_ETHER_H */ 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef NETINET_ETHER_H_DECLARES_ETHER_NTOHOST 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <netinet/ether.h> 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* NETINET_ETHER_H_DECLARES_ETHER_NTOHOST */ 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if !defined(HAVE_DECL_ETHER_NTOHOST) || !HAVE_DECL_ETHER_NTOHOST 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_STRUCT_ETHER_ADDR 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ether_addr { 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char ether_addr_octet[6]; 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int ether_ntohost(char *, const struct ether_addr *); 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* USE_ETHER_NTOHOST */ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap-namedb.h> 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <signal.h> 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llc.h" 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "setsignal.h" 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oui.h" 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef ETHER_ADDR_LEN 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ETHER_ADDR_LEN 6 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * hash tables for whatever-to-name translations 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX there has to be error checks against strdup(3) failure 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define HASHNAMESIZE 4096 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct hnamemem { 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t addr; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *name; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct hnamemem *nxt; 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem hnametable[HASHNAMESIZE]; 9053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem tporttable[HASHNAMESIZE]; 9153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem uporttable[HASHNAMESIZE]; 9253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem eprototable[HASHNAMESIZE]; 9353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem dnaddrtable[HASHNAMESIZE]; 9453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct hnamemem ipxsaptable[HASHNAMESIZE]; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(INET6) && defined(WIN32) 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * fake gethostbyaddr for Win2k/XP 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * gethostbyaddr() returns incorrect value when AF_INET6 is passed 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to 3rd argument. 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * h_name in struct hostent is only valid. 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct hostent * 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectwin32_gethostbyaddr(const char *addr, int len, int type) 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static struct hostent host; 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char hostbuf[NI_MAXHOST]; 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char hname[NI_MAXHOST]; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct sockaddr_in6 addr6; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project host.h_name = hostbuf; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (type) { 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AF_INET: 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return gethostbyaddr(addr, len, type); 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AF_INET6: 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&addr6, 0, sizeof(addr6)); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr6.sin6_family = AF_INET6; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr6.sin6_addr, addr, len); 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (getnameinfo((struct sockaddr *)&addr6, sizeof(addr6), 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hname, sizeof(hname), NULL, 0, 0)) { 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strcpy(host.h_name, hname); 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return &host; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return NULL; 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define gethostbyaddr win32_gethostbyaddr 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 & WIN32 */ 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct h6namemem { 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr addr; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *name; 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct h6namemem *nxt; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct h6namemem h6nametable[HASHNAMESIZE]; 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct enamemem { 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short e_addr0; 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short e_addr1; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short e_addr2; 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *e_name; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char *e_nsap; /* used only for nsaptable[] */ 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define e_bs e_nsap /* for bytestringtable */ 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct enamemem *e_nxt; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct enamemem enametable[HASHNAMESIZE]; 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct enamemem nsaptable[HASHNAMESIZE]; 15853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct enamemem bytestringtable[HASHNAMESIZE]; 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct protoidmem { 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t p_oui; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short p_proto; 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *p_name; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct protoidmem *p_nxt; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct protoidmem protoidtable[HASHNAMESIZE]; 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * A faster replacement for inet_ntoa(). 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectintoa(u_int32_t addr) 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int byte; 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int n; 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static char buf[sizeof(".xxx.xxx.xxx.xxx")]; 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NTOHL(addr); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf + sizeof(buf); 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *--cp = '\0'; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project n = 4; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project byte = addr & 0xff; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *--cp = byte % 10 + '0'; 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project byte /= 10; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (byte > 0) { 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *--cp = byte % 10 + '0'; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project byte /= 10; 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (byte > 0) 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *--cp = byte + '0'; 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *--cp = '.'; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr >>= 8; 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while (--n > 0); 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return cp + 1; 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int32_t f_netmask; 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int32_t f_localnet; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return a name for the IP address pointed to by ap. This address 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is assumed to be in network byte order. 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * NOTE: ap is *NOT* necessarily part of the packet data (not even if 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this is being called with the "ipaddr_string()" macro), so you 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * *CANNOT* use the TCHECK{2}/TTEST{2} macros on it. Furthermore, 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * even in cases where it *is* part of the packet data, the caller 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * would still have to check for a null return value, even if it's 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * just printing the return value with "%s" - not all versions of 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * printf print "(null)" with "%s" and a null pointer, some of them 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * don't check for a null pointer and crash in that case. 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The callers of this routine should, before handing this routine 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * a pointer to packet data, be sure that the data is present in 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the packet buffer. They should probably do those checks anyway, 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * as other data at that layer might not be IP addresses, and it 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * also needs to check whether they're present in the packet buffer. 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectgetname(const u_char *ap) 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hostent *hp; 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t addr; 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static struct hnamemem *p; /* static for longjmp() */ 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, ap, sizeof(addr)); 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = &hnametable[addr & (HASHNAMESIZE-1)]; 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (; p->nxt; p = p->nxt) { 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p->addr == addr) 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->addr = addr; 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->nxt = newhnamemem(); 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print names unless: 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (1) -n was given. 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (2) Address is foreign and -f was given. (If -f was not 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * given, f_netmask and f_localnet are 0 and the test 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * evaluates to true) 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!nflag && 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (addr & f_netmask) == f_localnet) { 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hp = gethostbyaddr((char *)&addr, 4, AF_INET); 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hp) { 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *dotp; 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->name = strdup(hp->h_name); 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (Nflag) { 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Remove domain qualifications */ 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dotp = strchr(p->name, '.'); 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dotp) 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dotp = '\0'; 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->name = strdup(intoa(addr)); 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return a name for the IP6 address pointed to by ap. This address 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is assumed to be in network byte order. 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectgetname6(const u_char *ap) 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hostent *hp; 27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall union { 27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct in6_addr addr; 27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct for_hash_addr { 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall char fill[14]; 28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int16_t d; 28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } addra; 28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } addr; 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static struct h6namemem *p; /* static for longjmp() */ 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const char *cp; 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char ntop_buf[INET6_ADDRSTRLEN]; 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&addr, ap, sizeof(addr)); 28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall p = &h6nametable[addr.addra.d & (HASHNAMESIZE-1)]; 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (; p->nxt; p = p->nxt) { 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(&p->addr, &addr, sizeof(addr)) == 0) 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall p->addr = addr.addr; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->nxt = newh6namemem(); 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Do not print names if -n was given. 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!nflag) { 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET6); 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hp) { 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *dotp; 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->name = strdup(hp->h_name); 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (Nflag) { 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Remove domain qualifications */ 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dotp = strchr(p->name, '.'); 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dotp) 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dotp = '\0'; 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = inet_ntop(AF_INET6, &addr, ntop_buf, sizeof(ntop_buf)); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p->name = strdup(cp); 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p->name); 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char hex[] = "0123456789abcdef"; 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Find the hash node that corresponds the ether address 'ep' */ 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline struct enamemem * 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_emem(const u_char *ep) 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, j, k; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct enamemem *tp; 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project k = (ep[0] << 8) | ep[1]; 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = (ep[2] << 8) | ep[3]; 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = (ep[4] << 8) | ep[5]; 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = &enametable[(i ^ j) & (HASHNAMESIZE-1)]; 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tp->e_nxt) 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_addr0 == i && 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 == j && 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 == k) 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = tp->e_nxt; 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr0 = i; 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 = j; 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 = k; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_nxt == NULL) 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("lookup_emem: calloc"); 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Find the hash node that corresponds to the bytestring 'bs' 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * with length 'nlen' 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline struct enamemem * 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_bytestring(register const u_char *bs, const unsigned int nlen) 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct enamemem *tp; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, j, k; 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nlen >= 6) { 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project k = (bs[0] << 8) | bs[1]; 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = (bs[2] << 8) | bs[3]; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = (bs[4] << 8) | bs[5]; 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (nlen >= 4) { 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project k = (bs[0] << 8) | bs[1]; 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = (bs[2] << 8) | bs[3]; 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = 0; 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = j = k = 0; 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = &bytestringtable[(i ^ j) & (HASHNAMESIZE-1)]; 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tp->e_nxt) 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_addr0 == i && 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 == j && 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 == k && 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcmp((const char *)bs, (const char *)(tp->e_bs), nlen) == 0) 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = tp->e_nxt; 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr0 = i; 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 = j; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 = k; 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_bs = (u_char *) calloc(1, nlen + 1); 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tp->e_bs == NULL) 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall error("lookup_bytestring: calloc"); 39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(tp->e_bs, bs, nlen); 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_nxt == NULL) 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("lookup_bytestring: calloc"); 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Find the hash node that corresponds the NSAP 'nsap' */ 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline struct enamemem * 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_nsap(register const u_char *nsap) 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, j, k; 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned int nlen = *nsap; 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct enamemem *tp; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *ensap = nsap + nlen - 6; 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nlen > 6) { 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project k = (ensap[0] << 8) | ensap[1]; 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = (ensap[2] << 8) | ensap[3]; 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = (ensap[4] << 8) | ensap[5]; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = j = k = 0; 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = &nsaptable[(i ^ j) & (HASHNAMESIZE-1)]; 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tp->e_nxt) 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_addr0 == i && 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 == j && 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 == k && 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_nsap[0] == nlen && 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcmp((const char *)&(nsap[1]), 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (char *)&(tp->e_nsap[1]), nlen) == 0) 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = tp->e_nxt; 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr0 = i; 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr1 = j; 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_addr2 = k; 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_nsap = (u_char *)malloc(nlen + 1); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_nsap == NULL) 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("lookup_nsap: malloc"); 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy((char *)tp->e_nsap, (const char *)nsap, nlen + 1); 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_nxt == NULL) 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("lookup_nsap: calloc"); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Find the hash node that corresponds the protoid 'pi'. */ 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline struct protoidmem * 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_protoid(const u_char *pi) 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, j; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct protoidmem *tp; 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 5 octets won't be aligned */ 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = (((pi[0] << 8) + pi[1]) << 8) + pi[2]; 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project j = (pi[3] << 8) + pi[4]; 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* XXX should be endian-insensitive, but do big-endian testing XXX */ 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = &protoidtable[(i ^ j) & (HASHNAMESIZE-1)]; 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tp->p_nxt) 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->p_oui == i && tp->p_proto == j) 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = tp->p_nxt; 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_oui = i; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_proto = j; 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp)); 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->p_nxt == NULL) 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("lookup_protoid: calloc"); 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp; 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectetheraddr_string(register const u_char *ep) 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct enamemem *tp; 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int oui; 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[BUFSIZE]; 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_emem(ep); 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_name) 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_ETHER_NTOHOST 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!nflag) { 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf2[BUFSIZE]; 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We don't cast it to "const struct ether_addr *" 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * because some systems fail to declare the second 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * argument as a "const" pointer, even though they 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * don't modify what it points to. 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ether_ntohost(buf2, (struct ether_addr *)ep) == 0) { 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = strdup(buf2); 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf; 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project oui = EXTRACT_24BITS(ep); 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep >> 4 ]; 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep++ & 0xf]; 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 5; --i >= 0;) { 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = ':'; 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep >> 4 ]; 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep++ & 0xf]; 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!nflag) { 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(cp, BUFSIZE - (2 + 5*3), " (oui %s)", 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(oui_values, "Unknown", oui)); 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp = '\0'; 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = strdup(buf); 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 52053f17a9db278d33517d9888dd77848f554522a38JP Abgrallle64addr_string(const u_char *ep) 52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall const unsigned int len = 8; 52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall register u_int i; 52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall register char *cp; 52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall register struct enamemem *tp; 52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall char buf[BUFSIZE]; 52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall tp = lookup_bytestring(ep, len); 52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tp->e_name) 53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (tp->e_name); 53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp = buf; 53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (i = len; i > 0 ; --i) { 53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *cp++ = hex[*(ep + i - 1) >> 4]; 53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall *cp++ = hex[*(ep + i - 1) & 0xf]; 53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *cp++ = ':'; 53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 53853f17a9db278d33517d9888dd77848f554522a38JP Abgrall cp --; 53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *cp = '\0'; 54153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall tp->e_name = strdup(buf); 54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (tp->e_name); 54553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 54653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 54753f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst char * 54853f17a9db278d33517d9888dd77848f554522a38JP Abgralllinkaddr_string(const u_char *ep, const unsigned int type, const unsigned int len) 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i; 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct enamemem *tp; 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 55453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (len == 0) 55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ("<empty>"); 55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN) 55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (etheraddr_string(ep)); 55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (type == LINKADDR_FRELAY) 56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (q922_string(ep)); 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_bytestring(ep, len); 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_name) 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = cp = (char *)malloc(len*3); 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_name == NULL) 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("linkaddr_string: malloc"); 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep >> 4]; 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep++ & 0xf]; 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = len-1; i > 0 ; --i) { 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = ':'; 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep >> 4]; 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*ep++ & 0xf]; 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp = '\0'; 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectetherproto_string(u_short port) 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp; 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t i = port; 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("0000")]; 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == i) 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = i; 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf; 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NTOHS(port); 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 12 & 0xf]; 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 8 & 0xf]; 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 4 & 0xf]; 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port & 0xf]; 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = '\0'; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(buf); 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotoid_string(register const u_char *pi) 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, j; 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct protoidmem *tp; 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("00:00:00:00:00")]; 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_protoid(pi); 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->p_name) 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp->p_name; 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf; 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((j = *pi >> 4) != 0) 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[j]; 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*pi++ & 0xf]; 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 4; (int)--i >= 0;) { 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = ':'; 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((j = *pi >> 4) != 0) 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[j]; 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*pi++ & 0xf]; 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp = '\0'; 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_name = strdup(buf); 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->p_name); 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ISONSAP_MAX_LENGTH 20 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisonsap_string(const u_char *nsap, register u_int nsap_length) 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int nsap_idx; 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct enamemem *tp; 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nsap_length < 1 || nsap_length > ISONSAP_MAX_LENGTH) 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ("isonsap_string: illegal length"); 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_nsap(nsap); 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_name) 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return tp->e_name; 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx")); 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cp == NULL) 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("isonsap_string: malloc"); 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) { 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*nsap >> 4]; 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[*nsap++ & 0xf]; 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (((nsap_idx & 1) == 0) && 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (nsap_idx + 1 < nsap_length)) { 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = '.'; 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp = '\0'; 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->e_name); 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttcpport_string(u_short port) 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp; 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t i = port; 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("00000")]; 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &tporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == i) 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = i; 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "%u", i); 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(buf); 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectudpport_string(register u_short port) 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp; 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t i = port; 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("00000")]; 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &uporttable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == i) 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = i; 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "%u", i); 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(buf); 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectipxsap_string(u_short port) 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char *cp; 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp; 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t i = port; 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("0000")]; 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &ipxsaptable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == i) 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = i; 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = buf; 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NTOHS(port); 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 12 & 0xf]; 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 8 & 0xf]; 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port >> 4 & 0xf]; 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = hex[port & 0xf]; 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *cp++ = '\0'; 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = strdup(buf); 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_servarray(void) 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct servent *sv; 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *table; 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[sizeof("0000000000")]; 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((sv = getservent()) != NULL) { 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int port = ntohs(sv->s_port); 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = port & (HASHNAMESIZE-1); 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (strcmp(sv->s_proto, "tcp") == 0) 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = &tporttable[i]; 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (strcmp(sv->s_proto, "udp") == 0) 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = &uporttable[i]; 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (table->name) 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = table->nxt; 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nflag) { 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)snprintf(buf, sizeof(buf), "%d", port); 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->name = strdup(buf); 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->name = strdup(sv->s_name); 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->addr = port; 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->nxt = newhnamemem(); 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project endservent(); 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* in libpcap.a (nametoaddr.c) */ 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(WIN32) && !defined(USE_STATIC_LIBPCAP) 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project__declspec(dllimport) 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct eproto { 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *s; 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short p; 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} eproto_db[]; 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_eprotoarray(void) 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *table; 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; eproto_db[i].s; i++) { 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int j = htons(eproto_db[i].p) & (HASHNAMESIZE-1); 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = &eprototable[j]; 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (table->name) 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = table->nxt; 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->name = eproto_db[i].s; 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->addr = htons(eproto_db[i].p); 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->nxt = newhnamemem(); 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 78853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct protoidlist { 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char protoid[5]; 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *name; 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} protoidlist[] = { 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x0c, 0x01, 0x07 }, "CiscoMLS" }, 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x0c, 0x20, 0x00 }, "CiscoCDP" }, 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x0c, 0x20, 0x01 }, "CiscoCGMP" }, 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x0c, 0x20, 0x03 }, "CiscoVTP" }, 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0xe0, 0x2b, 0x00, 0xbb }, "ExtremeEDP" }, 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL } 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SNAP proto IDs with org code 0:0:0 are actually encapsulated Ethernet 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * types. 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_protoidarray(void) 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct protoidmem *tp; 80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct protoidlist *pl; 8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char protoid[5]; 8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project protoid[0] = 0; 8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project protoid[1] = 0; 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project protoid[2] = 0; 8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; eproto_db[i].s; i++) { 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short etype = htons(eproto_db[i].p); 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy((char *)&protoid[3], (char *)&etype, 2); 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_protoid(protoid); 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_name = strdup(eproto_db[i].s); 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Hardwire some SNAP proto ID names */ 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (pl = protoidlist; pl->name != NULL; ++pl) { 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_protoid(pl->protoid); 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Don't override existing name */ 8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->p_name != NULL) 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->p_name = pl->name; 8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 83353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct etherlist { 8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char addr[6]; 8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *name; 8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} etherlist[] = { 8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, "Broadcast" }, 8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL } 8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Initialize the ethers hash table. We take two different approaches 8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * depending on whether or not the system provides the ethers name 8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * service. If it does, we just wire in a few names at startup, 8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and etheraddr_string() fills in the table on demand. If it doesn't, 8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * then we suck in the entire /etc/ethers file at startup. The idea 8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is that parsing the local file will be fast, but spinning through 8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * all the ethers entries via NIS & next_etherent might be very slow. 8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX pcap_next_etherent doesn't belong in the pcap interface, but 8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * since the pcap module already does name-to-address translation, 8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * it's already does most of the work for the ethernet address-to-name 8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * translation, so we just pcap_next_etherent as a convenience. 8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_etherarray(void) 8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 85853f17a9db278d33517d9888dd77848f554522a38JP Abgrall register const struct etherlist *el; 8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct enamemem *tp; 8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_ETHER_NTOHOST 8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char name[256]; 8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct pcap_etherent *ep; 8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register FILE *fp; 8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Suck in entire ethers file */ 8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fp = fopen(PCAP_ETHERS_FILE, "r"); 8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fp != NULL) { 8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while ((ep = pcap_next_etherent(fp)) != NULL) { 8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_emem(ep->addr); 8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = strdup(ep->name); 8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)fclose(fp); 8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Hardwire some ethernet names */ 8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (el = etherlist; el->name != NULL; ++el) { 8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = lookup_emem(el->addr); 8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Don't override existing name */ 8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->e_name != NULL) 8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_ETHER_NTOHOST 8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Use YP/NIS version of name if available. 8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We don't cast it to "const struct ether_addr *" 8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * because some systems don't modify the Ethernet 8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * address but fail to declare the second argument 8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * as a "const" pointer. 8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ether_ntohost(name, (struct ether_addr *)el->addr) == 0) { 8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = strdup(name); 8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project continue; 8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->e_name = el->name; 8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 90253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ipxsap_db[] = { 9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0000, "Unknown" }, 9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0001, "User" }, 9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0002, "User Group" }, 9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0003, "PrintQueue" }, 9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0004, "FileServer" }, 9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0005, "JobServer" }, 9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0006, "Gateway" }, 9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0007, "PrintServer" }, 9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0008, "ArchiveQueue" }, 9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0009, "ArchiveServer" }, 9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x000a, "JobQueue" }, 9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x000b, "Administration" }, 9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x000F, "Novell TI-RPC" }, 9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0017, "Diagnostics" }, 9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0020, "NetBIOS" }, 9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0021, "NAS SNA Gateway" }, 9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0023, "NACS AsyncGateway" }, 9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0024, "RemoteBridge/RoutingService" }, 9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0026, "BridgeServer" }, 9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0027, "TCP/IP Gateway" }, 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0028, "Point-to-point X.25 BridgeServer" }, 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0029, "3270 Gateway" }, 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x002a, "CHI Corp" }, 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x002c, "PC Chalkboard" }, 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x002d, "TimeSynchServer" }, 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x002e, "ARCserve5.0/PalindromeBackup" }, 9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0045, "DI3270 Gateway" }, 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0047, "AdvertisingPrintServer" }, 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x004a, "NetBlazerModems" }, 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x004b, "BtrieveVAP" }, 9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x004c, "NetwareSQL" }, 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x004d, "XtreeNetwork" }, 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0050, "BtrieveVAP4.11" }, 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0052, "QuickLink" }, 9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0053, "PrintQueueUser" }, 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0058, "Multipoint X.25 Router" }, 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0060, "STLB/NLM" }, 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0064, "ARCserve" }, 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0066, "ARCserve3.0" }, 9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0072, "WAN CopyUtility" }, 9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x007a, "TES-NetwareVMS" }, 9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0092, "WATCOM Debugger/EmeraldTapeBackupServer" }, 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0095, "DDA OBGYN" }, 9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0098, "NetwareAccessServer" }, 9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x009a, "Netware for VMS II/NamedPipeServer" }, 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x009b, "NetwareAccessServer" }, 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x009e, "PortableNetwareServer/SunLinkNVT" }, 9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x00a1, "PowerchuteAPC UPS" }, 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x00aa, "LAWserve" }, 9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x00ac, "CompaqIDA StatusMonitor" }, 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0100, "PIPE STAIL" }, 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0102, "LAN ProtectBindery" }, 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0103, "OracleDataBaseServer" }, 9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0107, "Netware386/RSPX RemoteConsole" }, 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x010f, "NovellSNA Gateway" }, 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0111, "TestServer" }, 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0112, "HP PrintServer" }, 9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0114, "CSA MUX" }, 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0115, "CSA LCA" }, 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0116, "CSA CM" }, 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0117, "CSA SMA" }, 9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0118, "CSA DBA" }, 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0119, "CSA NMA" }, 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x011a, "CSA SSA" }, 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x011b, "CSA STATUS" }, 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x011e, "CSA APPC" }, 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0126, "SNA TEST SSA Profile" }, 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x012a, "CSA TRACE" }, 9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x012b, "NetwareSAA" }, 9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x012e, "IKARUS VirusScan" }, 9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0130, "CommunicationsExecutive" }, 9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0133, "NNS DomainServer/NetwareNamingServicesDomain" }, 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0135, "NetwareNamingServicesProfile" }, 9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0137, "Netware386 PrintQueue/NNS PrintQueue" }, 9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0141, "LAN SpoolServer" }, 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0152, "IRMALAN Gateway" }, 9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0154, "NamedPipeServer" }, 9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0166, "NetWareManagement" }, 9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0168, "Intel PICKIT CommServer/Intel CAS TalkServer" }, 9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0173, "Compaq" }, 9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0174, "Compaq SNMP Agent" }, 9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0175, "Compaq" }, 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0180, "XTreeServer/XTreeTools" }, 9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x018A, "NASI ServicesBroadcastServer" }, 9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01b0, "GARP Gateway" }, 9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01b1, "Binfview" }, 9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01bf, "IntelLanDeskManager" }, 9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01ca, "AXTEC" }, 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01cb, "ShivaNetModem/E" }, 9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01cc, "ShivaLanRover/E" }, 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01cd, "ShivaLanRover/T" }, 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01ce, "ShivaUniversal" }, 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01d8, "CastelleFAXPressServer" }, 9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01da, "CastelleLANPressPrintServer" }, 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01dc, "CastelleFAX/Xerox7033 FaxServer/ExcelLanFax" }, 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01f0, "LEGATO" }, 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01f5, "LEGATO" }, 10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0233, "NMS Agent/NetwareManagementAgent" }, 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0237, "NMS IPX Discovery/LANternReadWriteChannel" }, 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0238, "NMS IP Discovery/LANternTrapAlarmChannel" }, 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x023a, "LANtern" }, 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x023c, "MAVERICK" }, 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x023f, "NovellSMDR" }, 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x024e, "NetwareConnect" }, 10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x024f, "NASI ServerBroadcast Cisco" }, 10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x026a, "NMS ServiceConsole" }, 10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x026b, "TimeSynchronizationServer Netware 4.x" }, 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0278, "DirectoryServer Netware 4.x" }, 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x027b, "NetwareManagementAgent" }, 10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0280, "Novell File and Printer Sharing Service for PC" }, 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0304, "NovellSAA Gateway" }, 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0308, "COM/VERMED" }, 10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x030a, "GalacticommWorldgroupServer" }, 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x030c, "IntelNetport2/HP JetDirect/HP Quicksilver" }, 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0320, "AttachmateGateway" }, 10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0327, "MicrosoftDiagnostiocs" }, 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0328, "WATCOM SQL Server" }, 10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0335, "MultiTechSystems MultisynchCommServer" }, 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0343, "Xylogics RemoteAccessServer/LANModem" }, 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0355, "ArcadaBackupExec" }, 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0358, "MSLCD1" }, 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0361, "NETINELO" }, 10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x037e, "Powerchute UPS Monitoring" }, 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x037f, "ViruSafeNotify" }, 10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0386, "HP Bridge" }, 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0387, "HP Hub" }, 10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0394, "NetWare SAA Gateway" }, 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x039b, "LotusNotes" }, 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03b7, "CertusAntiVirus" }, 10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03c4, "ARCserve4.0" }, 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03c7, "LANspool3.5" }, 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03d7, "LexmarkPrinterServer" }, 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03d8, "LexmarkXLE PrinterServer" }, 10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03dd, "BanyanENS NetwareClient" }, 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03de, "GuptaSequelBaseServer/NetWareSQL" }, 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03e1, "UnivelUnixware" }, 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03e4, "UnivelUnixware" }, 10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03fc, "IntelNetport" }, 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03fd, "PrintServerQueue" }, 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x040A, "ipnServer" }, 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x040D, "LVERRMAN" }, 10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x040E, "LVLIC" }, 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0414, "NET Silicon (DPI)/Kyocera" }, 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0429, "SiteLockVirus" }, 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0432, "UFHELPR???" }, 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0433, "Synoptics281xAdvancedSNMPAgent" }, 10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0444, "MicrosoftNT SNA Server" }, 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0448, "Oracle" }, 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x044c, "ARCserve5.01" }, 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0457, "CanonGP55" }, 10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x045a, "QMS Printers" }, 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x045b, "DellSCSI Array" }, 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0491, "NetBlazerModems" }, 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04ac, "OnTimeScheduler" }, 10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04b0, "CD-Net" }, 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0513, "EmulexNQA" }, 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0520, "SiteLockChecks" }, 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0529, "SiteLockChecks" }, 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x052d, "CitrixOS2 AppServer" }, 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0535, "Tektronix" }, 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0536, "Milan" }, 10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x055d, "Attachmate SNA gateway" }, 10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x056b, "IBM8235 ModemServer" }, 10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x056c, "ShivaLanRover/E PLUS" }, 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x056d, "ShivaLanRover/T PLUS" }, 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0580, "McAfeeNetShield" }, 10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x05B8, "NLM to workstation communication (Revelation Software)" }, 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x05BA, "CompatibleSystemsRouters" }, 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x05BE, "CheyenneHierarchicalStorageManager" }, 10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0606, "JCWatermarkImaging" }, 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x060c, "AXISNetworkPrinter" }, 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0610, "AdaptecSCSIManagement" }, 10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0621, "IBM AntiVirus" }, 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0640, "Windows95 RemoteRegistryService" }, 10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x064e, "MicrosoftIIS" }, 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x067b, "Microsoft Win95/98 File and Print Sharing for NetWare" }, 10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x067c, "Microsoft Win95/98 File and Print Sharing for NetWare" }, 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x076C, "Xerox" }, 10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x079b, "ShivaLanRover/E 115" }, 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x079c, "ShivaLanRover/T 115" }, 10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x07B4, "CubixWorldDesk" }, 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x07c2, "Quarterdeck IWare Connect V2.x NLM" }, 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x07c1, "Quarterdeck IWare Connect V3.x NLM" }, 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0810, "ELAN License Server Demo" }, 10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0824, "ShivaLanRoverAccessSwitch/E" }, 10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x086a, "ISSC Collector" }, 10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x087f, "ISSC DAS AgentAIX" }, 10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0880, "Intel Netport PRO" }, 10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0881, "Intel Netport PRO" }, 10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0b29, "SiteLock" }, 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0c29, "SiteLockApplications" }, 10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0c2c, "LicensingServer" }, 10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x2101, "PerformanceTechnologyInstantInternet" }, 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x2380, "LAI SiteLock" }, 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x238c, "MeetingMaker" }, 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x4808, "SiteLockServer/SiteLockMetering" }, 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x5555, "SiteLockUser" }, 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x6312, "Tapeware" }, 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x6f00, "RabbitGateway" }, 11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x7703, "MODEM" }, 11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x8002, "NetPortPrinters" }, 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x8008, "WordPerfectNetworkVersion" }, 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x85BE, "Cisco EIGRP" }, 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x8888, "WordPerfectNetworkVersion/QuickNetworkManagement" }, 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x9000, "McAfeeNetShield" }, 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x9604, "CSA-NT_MON" }, 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xb6a8, "OceanIsleReachoutRemoteControl" }, 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xf11f, "SiteLockMetering" }, 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xf1ff, "SiteLock" }, 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xf503, "Microsoft SQL Server" }, 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xF905, "IBM TimeAndPlace" }, 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xfbfb, "TopCallIII FaxServer" }, 11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0xffff, "AnyService/Wildcard" }, 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, (char *)0 } 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_ipxsaparray(void) 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *table; 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; ipxsap_db[i].s != NULL; i++) { 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1); 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = &ipxsaptable[j]; 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (table->name) 11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table = table->nxt; 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->name = ipxsap_db[i].s; 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->addr = htons(ipxsap_db[i].v); 11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project table->nxt = newhnamemem(); 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Initialize the address to name translation machinery. We map all 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * non-local IP addresses to numeric addresses if fflag is true (i.e., 11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to prevent blocking on the nameserver). localnet is the IP address 11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * of the local network. mask is its subnet mask. 11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinit_addrtoname(u_int32_t localnet, u_int32_t mask) 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fflag) { 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f_localnet = localnet; 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f_netmask = mask; 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nflag) 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Simplest way to suppress names. 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project init_etherarray(); 11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project init_servarray(); 11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project init_eprotoarray(); 11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project init_protoidarray(); 11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project init_ipxsaparray(); 11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char * 11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdnaddr_string(u_short dnaddr) 11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *tp; 11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (tp = &dnaddrtable[dnaddr & (HASHNAMESIZE-1)]; tp->nxt != 0; 11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = tp->nxt) 11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tp->addr == dnaddr) 11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (tp->name); 11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->addr = dnaddr; 11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->nxt = newhnamemem(); 11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (nflag) 11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = dnnum_string(dnaddr); 11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp->name = dnname_string(dnaddr); 11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(tp->name); 11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */ 11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct hnamemem * 11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnewhnamemem(void) 11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct hnamemem *p; 11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static struct hnamemem *ptr = NULL; 11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static u_int num = 0; 11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (num <= 0) { 11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num = 64; 11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr = (struct hnamemem *)calloc(num, sizeof (*ptr)); 11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ptr == NULL) 11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("newhnamemem: calloc"); 11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project --num; 11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = ptr++; 11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p); 11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Return a zero'ed h6namemem struct and cuts down on calloc() overhead */ 12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct h6namemem * 12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnewh6namemem(void) 12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct h6namemem *p; 12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static struct h6namemem *ptr = NULL; 12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static u_int num = 0; 12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (num <= 0) { 12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num = 64; 12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr = (struct h6namemem *)calloc(num, sizeof (*ptr)); 12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ptr == NULL) 12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("newh6namemem: calloc"); 12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project --num; 12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p = ptr++; 12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (p); 12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 1221