12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*	$OpenBSD: print-cnfp.c,v 1.2 1998/06/25 20:26:59 mickey Exp $	*/
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1998 Michael Shalayeff
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	This product includes software developed by Michael Shalayeff.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. The name of the author may not be used to endorse or promote products
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    derived from this software without specific prior written permission.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Cisco NetFlow protocol */
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-cnfp.c,v 1.17 2005-04-20 20:53:18 guy Exp $";
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h"
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct nfhdr {
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	ver_cnt;	/* version [15], and # of records */
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	msys_uptime;
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	utc_sec;
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	utc_nsec;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	sequence;	/* v5 flow sequence number */
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	reserved;	/* v5 only */
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct nfrec {
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	src_ina;
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	dst_ina;
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	nhop_ina;
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	ifaces;		/* src,dst ifaces */
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	packets;
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	octets;
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	start_time;	/* sys_uptime value */
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	last_time;	/* sys_uptime value */
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	ports;		/* src,dst ports */
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	proto_tos;	/* proto, tos, pad, flags(v5) */
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	asses;		/* v1: flags; v5: src,dst AS */
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	masks;		/* src,dst addr prefix; v6: encaps */
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	peer_nexthop;	/* v6: IP address of the nexthop within the peer (FIB)*/
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcnfp_print(const u_char *cp, const u_char *bp _U_)
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct nfhdr *nh;
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct nfrec *nr;
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct protoent *pent;
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int nrecs, ver;
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	time_t t;
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nh = (const struct nfhdr *)cp;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((const u_char *)(nh + 1) > snapend)
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nrecs = EXTRACT_32BITS(&nh->ver_cnt) & 0xffff;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ver = (EXTRACT_32BITS(&nh->ver_cnt) & 0xffff0000) >> 16;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * This is seconds since the UN*X epoch, and is followed by
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * nanoseconds.  XXX - format it, rather than just dumping the
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * raw seconds-since-the-Epoch.
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = EXTRACT_32BITS(&nh->utc_sec);
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec));
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ver == 5 || ver == 6) {
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("#%u, ", EXTRACT_32BITS(&nh->sequence));
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nr = (const struct nfrec *)&nh[1];
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snaplen -= 24;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nr = (const struct nfrec *)&nh->sequence;
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snaplen -= 16;
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%2u recs", nrecs);
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (; nrecs-- && (const u_char *)(nr + 1) <= snapend; nr++) {
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char buf[20];
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char asbuf[20];
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n  started %u.%03u, last %u.%03u",
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)/1000,
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)%1000,
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->last_time)/1000,
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->last_time)%1000);
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		asbuf[0] = buf[0] = '\0';
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ver == 5 || ver == 6) {
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snprintf(buf, sizeof(buf), "/%u",
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 (EXTRACT_32BITS(&nr->masks) >> 24) & 0xff);
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snprintf(asbuf, sizeof(asbuf), ":%u",
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 (EXTRACT_32BITS(&nr->asses) >> 16) & 0xffff);
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&nr->ports) >> 16);
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ver == 5 || ver ==6) {
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snprintf(buf, sizeof(buf), "/%d",
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 (EXTRACT_32BITS(&nr->masks) >> 16) & 0xff);
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snprintf(asbuf, sizeof(asbuf), ":%u",
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 EXTRACT_32BITS(&nr->asses) & 0xffff);
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&nr->ports) & 0xffff);
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(">> %s\n    ", intoa(nr->nhop_ina.s_addr));
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pent = getprotobynumber((EXTRACT_32BITS(&nr->proto_tos) >> 8) & 0xff);
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!pent || nflag)
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%u ",
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       (EXTRACT_32BITS(&nr->proto_tos) >> 8) & 0xff);
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s ", pent->p_name);
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* tcp flags for tcp only */
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pent && pent->p_proto == IPPROTO_TCP) {
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int flags;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (ver == 1)
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				flags = (EXTRACT_32BITS(&nr->asses) >> 24) & 0xff;
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				flags = (EXTRACT_32BITS(&nr->proto_tos) >> 16) & 0xff;
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_FIN)	putchar('F');
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_SYN)	putchar('S');
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_RST)	putchar('R');
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_PUSH)	putchar('P');
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_ACK)	putchar('A');
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags & TH_URG)	putchar('U');
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (flags)
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				putchar(' ');
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		buf[0]='\0';
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ver == 6) {
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snprintf(buf, sizeof(buf), "(%u<>%u encaps)",
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 (EXTRACT_32BITS(&nr->masks) >> 8) & 0xff,
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 (EXTRACT_32BITS(&nr->masks)) & 0xff);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("tos %u, %u (%u octets) %s",
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->proto_tos) & 0xff,
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->packets),
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->octets), buf);
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
191