12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 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 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-chdlc.c,v 1.43 2005-11-29 08:56:19 hannes Exp $ (LBL)"; 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ppp.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "chdlc.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void chdlc_slarp_print(const u_char *, u_int); 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok chdlc_cast_values[] = { 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { CHDLC_UNICAST, "unicast" }, 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { CHDLC_BCAST, "bcast" }, 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Standard CHDLC printer */ 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchdlc_if_print(const struct pcap_pkthdr *h, register const u_char *p) 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int length = h->len; 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int caplen = h->caplen; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < CHDLC_HDRLEN) { 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|chdlc]"); 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (caplen); 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (chdlc_print(p,length)); 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchdlc_print(register const u_char *p, u_int length) { 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int proto; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project proto = EXTRACT_16BITS(&p[2]); 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eflag) { 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s, ethertype %s (0x%04x), length %u: ", 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(chdlc_cast_values, "0x%02x", p[0]), 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ethertype_values, "Unknown", proto), 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project proto, 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= CHDLC_HDRLEN; 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += CHDLC_HDRLEN; 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (proto) { 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ETHERTYPE_IP: 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip_print(gndo, p, length); 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ETHERTYPE_IPV6: 8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall ip6_print(gndo, p, length); 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CHDLC_TYPE_SLARP: 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chdlc_slarp_print(p, length); 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CHDLC_TYPE_CDP: 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project chdlc_cdp_print(p, length); 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ETHERTYPE_MPLS: 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ETHERTYPE_MPLS_MULTI: 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mpls_print(p, length); 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ETHERTYPE_ISO: 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* is the fudge byte set ? lets verify by spotting ISO headers */ 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (*(p+1) == 0x81 || 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(p+1) == 0x82 || 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(p+1) == 0x83) 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isoclns_print(p+1, length-1, length-1); 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project isoclns_print(p, length, length); 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("unknown CHDLC protocol (0x%04x)", proto); 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (CHDLC_HDRLEN); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The fixed-length portion of a SLARP packet. 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct cisco_slarp { 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t code[4]; 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLARP_REQUEST 0 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLARP_REPLY 1 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLARP_KEEPALIVE 2 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct { 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t addr[4]; 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t mask[4]; 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } addr; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct { 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t myseq[4]; 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t yourseq[4]; 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t rel[2]; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } keep; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } un; 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLARP_MIN_LEN 14 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SLARP_MAX_LEN 18 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchdlc_slarp_print(const u_char *cp, u_int length) 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct cisco_slarp *slarp; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int sec,min,hrs,days; 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("SLARP (length: %u), ",length); 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < SLARP_MIN_LEN) 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project slarp = (const struct cisco_slarp *)cp; 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*slarp, SLARP_MIN_LEN); 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_32BITS(&slarp->code)) { 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case SLARP_REQUEST: 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("request"); 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * At least according to William "Chops" Westfield's 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * message in 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * http://www.nethelp.no/net/cisco-hdlc.txt 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the address and mask aren't used in requests - 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * they're just zero. 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case SLARP_REPLY: 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("reply %s/%s", 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&slarp->un.addr.addr), 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&slarp->un.addr.mask)); 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case SLARP_KEEPALIVE: 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("keepalive: mineseen=0x%08x, yourseen=0x%08x, reliability=0x%04x", 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&slarp->un.keep.myseq), 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&slarp->un.keep.yourseq), 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&slarp->un.keep.rel)); 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length >= SLARP_MAX_LEN) { /* uptime-stamp is optional */ 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += SLARP_MIN_LEN; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*cp, 4)) 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sec = EXTRACT_32BITS(cp) / 1000; 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project min = sec / 60; sec -= min * 60; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hrs = min / 60; min -= hrs * 60; 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project days = hrs / 24; hrs -= days * 24; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", link uptime=%ud%uh%um%us",days,hrs,min,sec); 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("0x%02x unknown", EXTRACT_32BITS(&slarp->code)); 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag <= 1) 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(cp+4,"\n\t",length-4); 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (SLARP_MAX_LEN < length && vflag) 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", (trailing junk: %d bytes)", length - SLARP_MAX_LEN); 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1) 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(cp+4,"\n\t",length-4); 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|slarp]"); 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables: 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End: 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 216