]> The Tcpdump Group git mirrors - libpcap/blob - sf-pcapng.c
Clean up the code to parse /proc/net/dev.
[libpcap] / sf-pcapng.c
1 /*
2 * Copyright (c) 1993, 1994, 1995, 1996, 1997
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
16 * written permission.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * sf-pcapng.c - pcapng-file-format-specific code from savefile.c
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27
28 #include <pcap/pcap-inttypes.h>
29
30 #include <errno.h>
31 #include <memory.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <limits.h> /* for INT_MAX */
36
37 #include "pcap-int.h"
38
39 #include "pcap-common.h"
40
41 #ifdef HAVE_OS_PROTO_H
42 #include "os-proto.h"
43 #endif
44
45 #include "sf-pcapng.h"
46
47 /*
48 * Block types.
49 */
50
51 /*
52 * Common part at the beginning of all blocks.
53 */
54 struct block_header {
55 bpf_u_int32 block_type;
56 bpf_u_int32 total_length;
57 };
58
59 /*
60 * Common trailer at the end of all blocks.
61 */
62 struct block_trailer {
63 bpf_u_int32 total_length;
64 };
65
66 /*
67 * Common options.
68 */
69 #define OPT_ENDOFOPT 0 /* end of options */
70 #define OPT_COMMENT 1 /* comment string */
71
72 /*
73 * Option header.
74 */
75 struct option_header {
76 u_short option_code;
77 u_short option_length;
78 };
79
80 /*
81 * Structures for the part of each block type following the common
82 * part.
83 */
84
85 /*
86 * Section Header Block.
87 */
88 #define BT_SHB 0x0A0D0D0A
89
90 struct section_header_block {
91 bpf_u_int32 byte_order_magic;
92 u_short major_version;
93 u_short minor_version;
94 uint64_t section_length;
95 /* followed by options and trailer */
96 };
97
98 /*
99 * Byte-order magic value.
100 */
101 #define BYTE_ORDER_MAGIC 0x1A2B3C4D
102
103 /*
104 * Current version number. If major_version isn't PCAP_NG_VERSION_MAJOR,
105 * that means that this code can't read the file.
106 */
107 #define PCAP_NG_VERSION_MAJOR 1
108 #define PCAP_NG_VERSION_MINOR 0
109
110 /*
111 * Interface Description Block.
112 */
113 #define BT_IDB 0x00000001
114
115 struct interface_description_block {
116 u_short linktype;
117 u_short reserved;
118 bpf_u_int32 snaplen;
119 /* followed by options and trailer */
120 };
121
122 /*
123 * Options in the IDB.
124 */
125 #define IF_NAME 2 /* interface name string */
126 #define IF_DESCRIPTION 3 /* interface description string */
127 #define IF_IPV4ADDR 4 /* interface's IPv4 address and netmask */
128 #define IF_IPV6ADDR 5 /* interface's IPv6 address and prefix length */
129 #define IF_MACADDR 6 /* interface's MAC address */
130 #define IF_EUIADDR 7 /* interface's EUI address */
131 #define IF_SPEED 8 /* interface's speed, in bits/s */
132 #define IF_TSRESOL 9 /* interface's time stamp resolution */
133 #define IF_TZONE 10 /* interface's time zone */
134 #define IF_FILTER 11 /* filter used when capturing on interface */
135 #define IF_OS 12 /* string OS on which capture on this interface was done */
136 #define IF_FCSLEN 13 /* FCS length for this interface */
137 #define IF_TSOFFSET 14 /* time stamp offset for this interface */
138
139 /*
140 * Enhanced Packet Block.
141 */
142 #define BT_EPB 0x00000006
143
144 struct enhanced_packet_block {
145 bpf_u_int32 interface_id;
146 bpf_u_int32 timestamp_high;
147 bpf_u_int32 timestamp_low;
148 bpf_u_int32 caplen;
149 bpf_u_int32 len;
150 /* followed by packet data, options, and trailer */
151 };
152
153 /*
154 * Simple Packet Block.
155 */
156 #define BT_SPB 0x00000003
157
158 struct simple_packet_block {
159 bpf_u_int32 len;
160 /* followed by packet data and trailer */
161 };
162
163 /*
164 * Packet Block.
165 */
166 #define BT_PB 0x00000002
167
168 struct packet_block {
169 u_short interface_id;
170 u_short drops_count;
171 bpf_u_int32 timestamp_high;
172 bpf_u_int32 timestamp_low;
173 bpf_u_int32 caplen;
174 bpf_u_int32 len;
175 /* followed by packet data, options, and trailer */
176 };
177
178 /*
179 * Block cursor - used when processing the contents of a block.
180 * Contains a pointer into the data being processed and a count
181 * of bytes remaining in the block.
182 */
183 struct block_cursor {
184 u_char *data;
185 size_t data_remaining;
186 bpf_u_int32 block_type;
187 };
188
189 typedef enum {
190 PASS_THROUGH,
191 SCALE_UP_DEC,
192 SCALE_DOWN_DEC,
193 SCALE_UP_BIN,
194 SCALE_DOWN_BIN
195 } tstamp_scale_type_t;
196
197 /*
198 * Per-interface information.
199 */
200 struct pcap_ng_if {
201 uint64_t tsresol; /* time stamp resolution */
202 tstamp_scale_type_t scale_type; /* how to scale */
203 uint64_t scale_factor; /* time stamp scale factor for power-of-10 tsresol */
204 uint64_t tsoffset; /* time stamp offset */
205 };
206
207 /*
208 * Per-pcap_t private data.
209 *
210 * max_blocksize is the maximum size of a block that we'll accept. We
211 * reject blocks bigger than this, so we don't consume too much memory
212 * with a truly huge block. It can change as we see IDBs with different
213 * link-layer header types. (Currently, we don't support IDBs with
214 * different link-layer header types, but we will support it in the
215 * future, when we offer file-reading APIs that support it.)
216 *
217 * XXX - that's an issue on ILP32 platforms, where the maximum block
218 * size of 2^31-1 would eat all but one byte of the entire address space.
219 * It's less of an issue on ILP64/LLP64 platforms, but the actual size
220 * of the address space may be limited by 1) the number of *significant*
221 * address bits (currently, x86-64 only supports 48 bits of address), 2)
222 * any limitations imposed by the operating system; 3) any limitations
223 * imposed by the amount of available backing store for anonymous pages,
224 * so we impose a limit regardless of the size of a pointer.
225 */
226 struct pcap_ng_sf {
227 uint64_t user_tsresol; /* time stamp resolution requested by the user */
228 u_int max_blocksize; /* don't grow buffer size past this */
229 bpf_u_int32 ifcount; /* number of interfaces seen in this capture */
230 bpf_u_int32 ifaces_size; /* size of array below */
231 struct pcap_ng_if *ifaces; /* array of interface information */
232 };
233
234 /*
235 * The maximum block size we start with; we use an arbitrary value of
236 * 16 MiB.
237 */
238 #define INITIAL_MAX_BLOCKSIZE (16*1024*1024)
239
240 /*
241 * Maximum block size for a given maximum snapshot length; we define it
242 * as the size of an EPB with a max_snaplen-sized packet and 128KB of
243 * options.
244 */
245 #define MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen) \
246 (sizeof (struct block_header) + \
247 sizeof (struct enhanced_packet_block) + \
248 (max_snaplen) + 131072 + \
249 sizeof (struct block_trailer))
250
251 static void pcap_ng_cleanup(pcap_t *p);
252 static int pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr,
253 u_char **data);
254
255 static int
256 read_bytes(FILE *fp, void *buf, size_t bytes_to_read, int fail_on_eof,
257 char *errbuf)
258 {
259 size_t amt_read;
260
261 amt_read = fread(buf, 1, bytes_to_read, fp);
262 if (amt_read != bytes_to_read) {
263 if (ferror(fp)) {
264 pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
265 errno, "error reading dump file");
266 } else {
267 if (amt_read == 0 && !fail_on_eof)
268 return (0); /* EOF */
269 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
270 "truncated dump file; tried to read %" PRIsize " bytes, only got %" PRIsize,
271 bytes_to_read, amt_read);
272 }
273 return (-1);
274 }
275 return (1);
276 }
277
278 static int
279 read_block(FILE *fp, pcap_t *p, struct block_cursor *cursor, char *errbuf)
280 {
281 struct pcap_ng_sf *ps;
282 int status;
283 struct block_header bhdr;
284 struct block_trailer *btrlr;
285 u_char *bdata;
286 size_t data_remaining;
287
288 ps = p->priv;
289
290 status = read_bytes(fp, &bhdr, sizeof(bhdr), 0, errbuf);
291 if (status <= 0)
292 return (status); /* error or EOF */
293
294 if (p->swapped) {
295 bhdr.block_type = SWAPLONG(bhdr.block_type);
296 bhdr.total_length = SWAPLONG(bhdr.total_length);
297 }
298
299 /*
300 * Is this block "too small" - i.e., is it shorter than a block
301 * header plus a block trailer?
302 */
303 if (bhdr.total_length < sizeof(struct block_header) +
304 sizeof(struct block_trailer)) {
305 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
306 "block in pcapng dump file has a length of %u < %" PRIsize,
307 bhdr.total_length,
308 sizeof(struct block_header) + sizeof(struct block_trailer));
309 return (-1);
310 }
311
312 /*
313 * Is the block total length a multiple of 4?
314 */
315 if ((bhdr.total_length % 4) != 0) {
316 /*
317 * No. Report that as an error.
318 */
319 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
320 "block in pcapng dump file has a length of %u that is not a multiple of 4" PRIsize,
321 bhdr.total_length);
322 return (-1);
323 }
324
325 /*
326 * Is the buffer big enough?
327 */
328 if (p->bufsize < bhdr.total_length) {
329 /*
330 * No - make it big enough, unless it's too big, in
331 * which case we fail.
332 */
333 void *bigger_buffer;
334
335 if (bhdr.total_length > ps->max_blocksize) {
336 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "pcapng block size %u > maximum %u", bhdr.total_length,
337 ps->max_blocksize);
338 return (-1);
339 }
340 bigger_buffer = realloc(p->buffer, bhdr.total_length);
341 if (bigger_buffer == NULL) {
342 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
343 return (-1);
344 }
345 p->buffer = bigger_buffer;
346 }
347
348 /*
349 * Copy the stuff we've read to the buffer, and read the rest
350 * of the block.
351 */
352 memcpy(p->buffer, &bhdr, sizeof(bhdr));
353 bdata = (u_char *)p->buffer + sizeof(bhdr);
354 data_remaining = bhdr.total_length - sizeof(bhdr);
355 if (read_bytes(fp, bdata, data_remaining, 1, errbuf) == -1)
356 return (-1);
357
358 /*
359 * Get the block size from the trailer.
360 */
361 btrlr = (struct block_trailer *)(bdata + data_remaining - sizeof (struct block_trailer));
362 if (p->swapped)
363 btrlr->total_length = SWAPLONG(btrlr->total_length);
364
365 /*
366 * Is the total length from the trailer the same as the total
367 * length from the header?
368 */
369 if (bhdr.total_length != btrlr->total_length) {
370 /*
371 * No.
372 */
373 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
374 "block total length in header and trailer don't match");
375 return (-1);
376 }
377
378 /*
379 * Initialize the cursor.
380 */
381 cursor->data = bdata;
382 cursor->data_remaining = data_remaining - sizeof(struct block_trailer);
383 cursor->block_type = bhdr.block_type;
384 return (1);
385 }
386
387 static void *
388 get_from_block_data(struct block_cursor *cursor, size_t chunk_size,
389 char *errbuf)
390 {
391 void *data;
392
393 /*
394 * Make sure we have the specified amount of data remaining in
395 * the block data.
396 */
397 if (cursor->data_remaining < chunk_size) {
398 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
399 "block of type %u in pcapng dump file is too short",
400 cursor->block_type);
401 return (NULL);
402 }
403
404 /*
405 * Return the current pointer, and skip past the chunk.
406 */
407 data = cursor->data;
408 cursor->data += chunk_size;
409 cursor->data_remaining -= chunk_size;
410 return (data);
411 }
412
413 static struct option_header *
414 get_opthdr_from_block_data(pcap_t *p, struct block_cursor *cursor, char *errbuf)
415 {
416 struct option_header *opthdr;
417
418 opthdr = get_from_block_data(cursor, sizeof(*opthdr), errbuf);
419 if (opthdr == NULL) {
420 /*
421 * Option header is cut short.
422 */
423 return (NULL);
424 }
425
426 /*
427 * Byte-swap it if necessary.
428 */
429 if (p->swapped) {
430 opthdr->option_code = SWAPSHORT(opthdr->option_code);
431 opthdr->option_length = SWAPSHORT(opthdr->option_length);
432 }
433
434 return (opthdr);
435 }
436
437 static void *
438 get_optvalue_from_block_data(struct block_cursor *cursor,
439 struct option_header *opthdr, char *errbuf)
440 {
441 size_t padded_option_len;
442 void *optvalue;
443
444 /* Pad option length to 4-byte boundary */
445 padded_option_len = opthdr->option_length;
446 padded_option_len = ((padded_option_len + 3)/4)*4;
447
448 optvalue = get_from_block_data(cursor, padded_option_len, errbuf);
449 if (optvalue == NULL) {
450 /*
451 * Option value is cut short.
452 */
453 return (NULL);
454 }
455
456 return (optvalue);
457 }
458
459 static int
460 process_idb_options(pcap_t *p, struct block_cursor *cursor, uint64_t *tsresol,
461 uint64_t *tsoffset, int *is_binary, char *errbuf)
462 {
463 struct option_header *opthdr;
464 void *optvalue;
465 int saw_tsresol, saw_tsoffset;
466 uint8_t tsresol_opt;
467 u_int i;
468
469 saw_tsresol = 0;
470 saw_tsoffset = 0;
471 while (cursor->data_remaining != 0) {
472 /*
473 * Get the option header.
474 */
475 opthdr = get_opthdr_from_block_data(p, cursor, errbuf);
476 if (opthdr == NULL) {
477 /*
478 * Option header is cut short.
479 */
480 return (-1);
481 }
482
483 /*
484 * Get option value.
485 */
486 optvalue = get_optvalue_from_block_data(cursor, opthdr,
487 errbuf);
488 if (optvalue == NULL) {
489 /*
490 * Option value is cut short.
491 */
492 return (-1);
493 }
494
495 switch (opthdr->option_code) {
496
497 case OPT_ENDOFOPT:
498 if (opthdr->option_length != 0) {
499 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
500 "Interface Description Block has opt_endofopt option with length %u != 0",
501 opthdr->option_length);
502 return (-1);
503 }
504 goto done;
505
506 case IF_TSRESOL:
507 if (opthdr->option_length != 1) {
508 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
509 "Interface Description Block has if_tsresol option with length %u != 1",
510 opthdr->option_length);
511 return (-1);
512 }
513 if (saw_tsresol) {
514 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
515 "Interface Description Block has more than one if_tsresol option");
516 return (-1);
517 }
518 saw_tsresol = 1;
519 memcpy(&tsresol_opt, optvalue, sizeof(tsresol_opt));
520 if (tsresol_opt & 0x80) {
521 /*
522 * Resolution is negative power of 2.
523 */
524 uint8_t tsresol_shift = (tsresol_opt & 0x7F);
525
526 if (tsresol_shift > 63) {
527 /*
528 * Resolution is too high; 2^-{res}
529 * won't fit in a 64-bit value.
530 */
531 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
532 "Interface Description Block if_tsresol option resolution 2^-%u is too high",
533 tsresol_shift);
534 return (-1);
535 }
536 *is_binary = 1;
537 *tsresol = ((uint64_t)1) << tsresol_shift;
538 } else {
539 /*
540 * Resolution is negative power of 10.
541 */
542 if (tsresol_opt > 19) {
543 /*
544 * Resolution is too high; 2^-{res}
545 * won't fit in a 64-bit value (the
546 * largest power of 10 that fits
547 * in a 64-bit value is 10^19, as
548 * the largest 64-bit unsigned
549 * value is ~1.8*10^19).
550 */
551 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
552 "Interface Description Block if_tsresol option resolution 10^-%u is too high",
553 tsresol_opt);
554 return (-1);
555 }
556 *is_binary = 0;
557 *tsresol = 1;
558 for (i = 0; i < tsresol_opt; i++)
559 *tsresol *= 10;
560 }
561 break;
562
563 case IF_TSOFFSET:
564 if (opthdr->option_length != 8) {
565 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
566 "Interface Description Block has if_tsoffset option with length %u != 8",
567 opthdr->option_length);
568 return (-1);
569 }
570 if (saw_tsoffset) {
571 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
572 "Interface Description Block has more than one if_tsoffset option");
573 return (-1);
574 }
575 saw_tsoffset = 1;
576 memcpy(tsoffset, optvalue, sizeof(*tsoffset));
577 if (p->swapped)
578 *tsoffset = SWAPLL(*tsoffset);
579 break;
580
581 default:
582 break;
583 }
584 }
585
586 done:
587 return (0);
588 }
589
590 static int
591 add_interface(pcap_t *p, struct block_cursor *cursor, char *errbuf)
592 {
593 struct pcap_ng_sf *ps;
594 uint64_t tsresol;
595 uint64_t tsoffset;
596 int is_binary;
597
598 ps = p->priv;
599
600 /*
601 * Count this interface.
602 */
603 ps->ifcount++;
604
605 /*
606 * Grow the array of per-interface information as necessary.
607 */
608 if (ps->ifcount > ps->ifaces_size) {
609 /*
610 * We need to grow the array.
611 */
612 bpf_u_int32 new_ifaces_size;
613 struct pcap_ng_if *new_ifaces;
614
615 if (ps->ifaces_size == 0) {
616 /*
617 * It's currently empty.
618 *
619 * (The Clang static analyzer doesn't do enough,
620 * err, umm, dataflow *analysis* to realize that
621 * ps->ifaces_size == 0 if ps->ifaces == NULL,
622 * and so complains about a possible zero argument
623 * to realloc(), so we check for the former
624 * condition to shut it up.
625 *
626 * However, it doesn't complain that one of the
627 * multiplications below could overflow, which is
628 * a real, albeit extremely unlikely, problem (you'd
629 * need a pcapng file with tens of millions of
630 * interfaces).)
631 */
632 new_ifaces_size = 1;
633 new_ifaces = malloc(sizeof (struct pcap_ng_if));
634 } else {
635 /*
636 * It's not currently empty; double its size.
637 * (Perhaps overkill once we have a lot of interfaces.)
638 *
639 * Check for overflow if we double it.
640 */
641 if (ps->ifaces_size * 2 < ps->ifaces_size) {
642 /*
643 * The maximum number of interfaces before
644 * ps->ifaces_size overflows is the largest
645 * possible 32-bit power of 2, as we do
646 * size doubling.
647 */
648 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
649 "more than %u interfaces in the file",
650 0x80000000U);
651 return (0);
652 }
653
654 /*
655 * ps->ifaces_size * 2 doesn't overflow, so it's
656 * safe to multiply.
657 */
658 new_ifaces_size = ps->ifaces_size * 2;
659
660 /*
661 * Now make sure that's not so big that it overflows
662 * if we multiply by sizeof (struct pcap_ng_if).
663 *
664 * That can happen on 32-bit platforms, with a 32-bit
665 * size_t; it shouldn't happen on 64-bit platforms,
666 * with a 64-bit size_t, as new_ifaces_size is
667 * 32 bits.
668 */
669 if (new_ifaces_size * sizeof (struct pcap_ng_if) < new_ifaces_size) {
670 /*
671 * As this fails only with 32-bit size_t,
672 * the multiplication was 32x32->32, and
673 * the largest 32-bit value that can safely
674 * be multiplied by sizeof (struct pcap_ng_if)
675 * without overflow is the largest 32-bit
676 * (unsigned) value divided by
677 * sizeof (struct pcap_ng_if).
678 */
679 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
680 "more than %u interfaces in the file",
681 0xFFFFFFFFU / ((u_int)sizeof (struct pcap_ng_if)));
682 return (0);
683 }
684 new_ifaces = realloc(ps->ifaces, new_ifaces_size * sizeof (struct pcap_ng_if));
685 }
686 if (new_ifaces == NULL) {
687 /*
688 * We ran out of memory.
689 * Give up.
690 */
691 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
692 "out of memory for per-interface information (%u interfaces)",
693 ps->ifcount);
694 return (0);
695 }
696 ps->ifaces_size = new_ifaces_size;
697 ps->ifaces = new_ifaces;
698 }
699
700 /*
701 * Set the default time stamp resolution and offset.
702 */
703 tsresol = 1000000; /* microsecond resolution */
704 is_binary = 0; /* which is a power of 10 */
705 tsoffset = 0; /* absolute timestamps */
706
707 /*
708 * Now look for various time stamp options, so we know
709 * how to interpret the time stamps for this interface.
710 */
711 if (process_idb_options(p, cursor, &tsresol, &tsoffset, &is_binary,
712 errbuf) == -1)
713 return (0);
714
715 ps->ifaces[ps->ifcount - 1].tsresol = tsresol;
716 ps->ifaces[ps->ifcount - 1].tsoffset = tsoffset;
717
718 /*
719 * Determine whether we're scaling up or down or not
720 * at all for this interface.
721 */
722 if (tsresol == ps->user_tsresol) {
723 /*
724 * The resolution is the resolution the user wants,
725 * so we don't have to do scaling.
726 */
727 ps->ifaces[ps->ifcount - 1].scale_type = PASS_THROUGH;
728 } else if (tsresol > ps->user_tsresol) {
729 /*
730 * The resolution is greater than what the user wants,
731 * so we have to scale the timestamps down.
732 */
733 if (is_binary)
734 ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_BIN;
735 else {
736 /*
737 * Calculate the scale factor.
738 */
739 ps->ifaces[ps->ifcount - 1].scale_factor = tsresol/ps->user_tsresol;
740 ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_DEC;
741 }
742 } else {
743 /*
744 * The resolution is less than what the user wants,
745 * so we have to scale the timestamps up.
746 */
747 if (is_binary)
748 ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_BIN;
749 else {
750 /*
751 * Calculate the scale factor.
752 */
753 ps->ifaces[ps->ifcount - 1].scale_factor = ps->user_tsresol/tsresol;
754 ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_DEC;
755 }
756 }
757 return (1);
758 }
759
760 /*
761 * Check whether this is a pcapng savefile and, if it is, extract the
762 * relevant information from the header.
763 */
764 pcap_t *
765 pcap_ng_check_header(const uint8_t *magic, FILE *fp, u_int precision,
766 char *errbuf, int *err)
767 {
768 bpf_u_int32 magic_int;
769 size_t amt_read;
770 bpf_u_int32 total_length;
771 bpf_u_int32 byte_order_magic;
772 struct block_header *bhdrp;
773 struct section_header_block *shbp;
774 pcap_t *p;
775 int swapped = 0;
776 struct pcap_ng_sf *ps;
777 int status;
778 struct block_cursor cursor;
779 struct interface_description_block *idbp;
780
781 /*
782 * Assume no read errors.
783 */
784 *err = 0;
785
786 /*
787 * Check whether the first 4 bytes of the file are the block
788 * type for a pcapng savefile.
789 */
790 memcpy(&magic_int, magic, sizeof(magic_int));
791 if (magic_int != BT_SHB) {
792 /*
793 * XXX - check whether this looks like what the block
794 * type would be after being munged by mapping between
795 * UN*X and DOS/Windows text file format and, if it
796 * does, look for the byte-order magic number in
797 * the appropriate place and, if we find it, report
798 * this as possibly being a pcapng file transferred
799 * between UN*X and Windows in text file format?
800 */
801 return (NULL); /* nope */
802 }
803
804 /*
805 * OK, they are. However, that's just \n\r\r\n, so it could,
806 * conceivably, be an ordinary text file.
807 *
808 * It could not, however, conceivably be any other type of
809 * capture file, so we can read the rest of the putative
810 * Section Header Block; put the block type in the common
811 * header, read the rest of the common header and the
812 * fixed-length portion of the SHB, and look for the byte-order
813 * magic value.
814 */
815 amt_read = fread(&total_length, 1, sizeof(total_length), fp);
816 if (amt_read < sizeof(total_length)) {
817 if (ferror(fp)) {
818 pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
819 errno, "error reading dump file");
820 *err = 1;
821 return (NULL); /* fail */
822 }
823
824 /*
825 * Possibly a weird short text file, so just say
826 * "not pcapng".
827 */
828 return (NULL);
829 }
830 amt_read = fread(&byte_order_magic, 1, sizeof(byte_order_magic), fp);
831 if (amt_read < sizeof(byte_order_magic)) {
832 if (ferror(fp)) {
833 pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
834 errno, "error reading dump file");
835 *err = 1;
836 return (NULL); /* fail */
837 }
838
839 /*
840 * Possibly a weird short text file, so just say
841 * "not pcapng".
842 */
843 return (NULL);
844 }
845 if (byte_order_magic != BYTE_ORDER_MAGIC) {
846 byte_order_magic = SWAPLONG(byte_order_magic);
847 if (byte_order_magic != BYTE_ORDER_MAGIC) {
848 /*
849 * Not a pcapng file.
850 */
851 return (NULL);
852 }
853 swapped = 1;
854 total_length = SWAPLONG(total_length);
855 }
856
857 /*
858 * Check the sanity of the total length.
859 */
860 if (total_length < sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer)) {
861 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
862 "Section Header Block in pcapng dump file has a length of %u < %" PRIsize,
863 total_length,
864 sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer));
865 *err = 1;
866 return (NULL);
867 }
868
869 /*
870 * Make sure it's not too big.
871 */
872 if (total_length > INITIAL_MAX_BLOCKSIZE) {
873 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
874 "pcapng block size %u > maximum %u",
875 total_length, INITIAL_MAX_BLOCKSIZE);
876 *err = 1;
877 return (NULL);
878 }
879
880 /*
881 * OK, this is a good pcapng file.
882 * Allocate a pcap_t for it.
883 */
884 p = pcap_open_offline_common(errbuf, sizeof (struct pcap_ng_sf));
885 if (p == NULL) {
886 /* Allocation failed. */
887 *err = 1;
888 return (NULL);
889 }
890 p->swapped = swapped;
891 ps = p->priv;
892
893 /*
894 * What precision does the user want?
895 */
896 switch (precision) {
897
898 case PCAP_TSTAMP_PRECISION_MICRO:
899 ps->user_tsresol = 1000000;
900 break;
901
902 case PCAP_TSTAMP_PRECISION_NANO:
903 ps->user_tsresol = 1000000000;
904 break;
905
906 default:
907 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
908 "unknown time stamp resolution %u", precision);
909 free(p);
910 *err = 1;
911 return (NULL);
912 }
913
914 p->opt.tstamp_precision = precision;
915
916 /*
917 * Allocate a buffer into which to read blocks. We default to
918 * the maximum of:
919 *
920 * the total length of the SHB for which we read the header;
921 *
922 * 2K, which should be more than large enough for an Enhanced
923 * Packet Block containing a full-size Ethernet frame, and
924 * leaving room for some options.
925 *
926 * If we find a bigger block, we reallocate the buffer, up to
927 * the maximum size. We start out with a maximum size of
928 * INITIAL_MAX_BLOCKSIZE; if we see any link-layer header types
929 * with a maximum snapshot that results in a larger maximum
930 * block length, we boost the maximum.
931 */
932 p->bufsize = 2048;
933 if (p->bufsize < total_length)
934 p->bufsize = total_length;
935 p->buffer = malloc(p->bufsize);
936 if (p->buffer == NULL) {
937 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
938 free(p);
939 *err = 1;
940 return (NULL);
941 }
942 ps->max_blocksize = INITIAL_MAX_BLOCKSIZE;
943
944 /*
945 * Copy the stuff we've read to the buffer, and read the rest
946 * of the SHB.
947 */
948 bhdrp = (struct block_header *)p->buffer;
949 shbp = (struct section_header_block *)((u_char *)p->buffer + sizeof(struct block_header));
950 bhdrp->block_type = magic_int;
951 bhdrp->total_length = total_length;
952 shbp->byte_order_magic = byte_order_magic;
953 if (read_bytes(fp,
954 (u_char *)p->buffer + (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
955 total_length - (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
956 1, errbuf) == -1)
957 goto fail;
958
959 if (p->swapped) {
960 /*
961 * Byte-swap the fields we've read.
962 */
963 shbp->major_version = SWAPSHORT(shbp->major_version);
964 shbp->minor_version = SWAPSHORT(shbp->minor_version);
965
966 /*
967 * XXX - we don't care about the section length.
968 */
969 }
970 /* currently only SHB version 1.0 is supported */
971 if (! (shbp->major_version == PCAP_NG_VERSION_MAJOR &&
972 shbp->minor_version == PCAP_NG_VERSION_MINOR)) {
973 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
974 "unsupported pcapng savefile version %u.%u",
975 shbp->major_version, shbp->minor_version);
976 goto fail;
977 }
978 p->version_major = shbp->major_version;
979 p->version_minor = shbp->minor_version;
980
981 /*
982 * Save the time stamp resolution the user requested.
983 */
984 p->opt.tstamp_precision = precision;
985
986 /*
987 * Now start looking for an Interface Description Block.
988 */
989 for (;;) {
990 /*
991 * Read the next block.
992 */
993 status = read_block(fp, p, &cursor, errbuf);
994 if (status == 0) {
995 /* EOF - no IDB in this file */
996 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
997 "the capture file has no Interface Description Blocks");
998 goto fail;
999 }
1000 if (status == -1)
1001 goto fail; /* error */
1002 switch (cursor.block_type) {
1003
1004 case BT_IDB:
1005 /*
1006 * Get a pointer to the fixed-length portion of the
1007 * IDB.
1008 */
1009 idbp = get_from_block_data(&cursor, sizeof(*idbp),
1010 errbuf);
1011 if (idbp == NULL)
1012 goto fail; /* error */
1013
1014 /*
1015 * Byte-swap it if necessary.
1016 */
1017 if (p->swapped) {
1018 idbp->linktype = SWAPSHORT(idbp->linktype);
1019 idbp->snaplen = SWAPLONG(idbp->snaplen);
1020 }
1021
1022 /*
1023 * Try to add this interface.
1024 */
1025 if (!add_interface(p, &cursor, errbuf))
1026 goto fail;
1027
1028 goto done;
1029
1030 case BT_EPB:
1031 case BT_SPB:
1032 case BT_PB:
1033 /*
1034 * Saw a packet before we saw any IDBs. That's
1035 * not valid, as we don't know what link-layer
1036 * encapsulation the packet has.
1037 */
1038 pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1039 "the capture file has a packet block before any Interface Description Blocks");
1040 goto fail;
1041
1042 default:
1043 /*
1044 * Just ignore it.
1045 */
1046 break;
1047 }
1048 }
1049
1050 done:
1051 if (idbp->snaplen == 0 || idbp->snaplen > INT_MAX) {
1052 /*
1053 * Bogus snapshot length; use the maximum for this
1054 * link-layer type as a fallback.
1055 *
1056 * XXX - the only reason why snapshot is signed is
1057 * that pcap_snapshot() returns an int, not an
1058 * unsigned int.
1059 */
1060 p->snapshot = max_snaplen_for_dlt(idbp->linktype);
1061 } else
1062 p->snapshot = idbp->snaplen;
1063 p->linktype = linktype_to_dlt(idbp->linktype);
1064 p->linktype_ext = 0;
1065
1066 /*
1067 * If the maximum block size for a packet with the maximum
1068 * snapshot length for this DLT_ is bigger than the current
1069 * maximum block size, increase the maximum.
1070 */
1071 if (MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype)) > ps->max_blocksize)
1072 ps->max_blocksize = MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype));
1073
1074 p->next_packet_op = pcap_ng_next_packet;
1075 p->cleanup_op = pcap_ng_cleanup;
1076
1077 return (p);
1078
1079 fail:
1080 free(ps->ifaces);
1081 free(p->buffer);
1082 free(p);
1083 *err = 1;
1084 return (NULL);
1085 }
1086
1087 static void
1088 pcap_ng_cleanup(pcap_t *p)
1089 {
1090 struct pcap_ng_sf *ps = p->priv;
1091
1092 free(ps->ifaces);
1093 sf_cleanup(p);
1094 }
1095
1096 /*
1097 * Read and return the next packet from the savefile. Return the header
1098 * in hdr and a pointer to the contents in data. Return 0 on success, 1
1099 * if there were no more packets, and -1 on an error.
1100 */
1101 static int
1102 pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data)
1103 {
1104 struct pcap_ng_sf *ps = p->priv;
1105 struct block_cursor cursor;
1106 int status;
1107 struct enhanced_packet_block *epbp;
1108 struct simple_packet_block *spbp;
1109 struct packet_block *pbp;
1110 bpf_u_int32 interface_id = 0xFFFFFFFF;
1111 struct interface_description_block *idbp;
1112 struct section_header_block *shbp;
1113 FILE *fp = p->rfile;
1114 uint64_t t, sec, frac;
1115
1116 /*
1117 * Look for an Enhanced Packet Block, a Simple Packet Block,
1118 * or a Packet Block.
1119 */
1120 for (;;) {
1121 /*
1122 * Read the block type and length; those are common
1123 * to all blocks.
1124 */
1125 status = read_block(fp, p, &cursor, p->errbuf);
1126 if (status == 0)
1127 return (1); /* EOF */
1128 if (status == -1)
1129 return (-1); /* error */
1130 switch (cursor.block_type) {
1131
1132 case BT_EPB:
1133 /*
1134 * Get a pointer to the fixed-length portion of the
1135 * EPB.
1136 */
1137 epbp = get_from_block_data(&cursor, sizeof(*epbp),
1138 p->errbuf);
1139 if (epbp == NULL)
1140 return (-1); /* error */
1141
1142 /*
1143 * Byte-swap it if necessary.
1144 */
1145 if (p->swapped) {
1146 /* these were written in opposite byte order */
1147 interface_id = SWAPLONG(epbp->interface_id);
1148 hdr->caplen = SWAPLONG(epbp->caplen);
1149 hdr->len = SWAPLONG(epbp->len);
1150 t = ((uint64_t)SWAPLONG(epbp->timestamp_high)) << 32 |
1151 SWAPLONG(epbp->timestamp_low);
1152 } else {
1153 interface_id = epbp->interface_id;
1154 hdr->caplen = epbp->caplen;
1155 hdr->len = epbp->len;
1156 t = ((uint64_t)epbp->timestamp_high) << 32 |
1157 epbp->timestamp_low;
1158 }
1159 goto found;
1160
1161 case BT_SPB:
1162 /*
1163 * Get a pointer to the fixed-length portion of the
1164 * SPB.
1165 */
1166 spbp = get_from_block_data(&cursor, sizeof(*spbp),
1167 p->errbuf);
1168 if (spbp == NULL)
1169 return (-1); /* error */
1170
1171 /*
1172 * SPB packets are assumed to have arrived on
1173 * the first interface.
1174 */
1175 interface_id = 0;
1176
1177 /*
1178 * Byte-swap it if necessary.
1179 */
1180 if (p->swapped) {
1181 /* these were written in opposite byte order */
1182 hdr->len = SWAPLONG(spbp->len);
1183 } else
1184 hdr->len = spbp->len;
1185
1186 /*
1187 * The SPB doesn't give the captured length;
1188 * it's the minimum of the snapshot length
1189 * and the packet length.
1190 */
1191 hdr->caplen = hdr->len;
1192 if (hdr->caplen > (bpf_u_int32)p->snapshot)
1193 hdr->caplen = p->snapshot;
1194 t = 0; /* no time stamps */
1195 goto found;
1196
1197 case BT_PB:
1198 /*
1199 * Get a pointer to the fixed-length portion of the
1200 * PB.
1201 */
1202 pbp = get_from_block_data(&cursor, sizeof(*pbp),
1203 p->errbuf);
1204 if (pbp == NULL)
1205 return (-1); /* error */
1206
1207 /*
1208 * Byte-swap it if necessary.
1209 */
1210 if (p->swapped) {
1211 /* these were written in opposite byte order */
1212 interface_id = SWAPSHORT(pbp->interface_id);
1213 hdr->caplen = SWAPLONG(pbp->caplen);
1214 hdr->len = SWAPLONG(pbp->len);
1215 t = ((uint64_t)SWAPLONG(pbp->timestamp_high)) << 32 |
1216 SWAPLONG(pbp->timestamp_low);
1217 } else {
1218 interface_id = pbp->interface_id;
1219 hdr->caplen = pbp->caplen;
1220 hdr->len = pbp->len;
1221 t = ((uint64_t)pbp->timestamp_high) << 32 |
1222 pbp->timestamp_low;
1223 }
1224 goto found;
1225
1226 case BT_IDB:
1227 /*
1228 * Interface Description Block. Get a pointer
1229 * to its fixed-length portion.
1230 */
1231 idbp = get_from_block_data(&cursor, sizeof(*idbp),
1232 p->errbuf);
1233 if (idbp == NULL)
1234 return (-1); /* error */
1235
1236 /*
1237 * Byte-swap it if necessary.
1238 */
1239 if (p->swapped) {
1240 idbp->linktype = SWAPSHORT(idbp->linktype);
1241 idbp->snaplen = SWAPLONG(idbp->snaplen);
1242 }
1243
1244 /*
1245 * If the link-layer type or snapshot length
1246 * differ from the ones for the first IDB we
1247 * saw, quit.
1248 *
1249 * XXX - just discard packets from those
1250 * interfaces?
1251 */
1252 if (p->linktype != idbp->linktype) {
1253 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1254 "an interface has a type %u different from the type of the first interface",
1255 idbp->linktype);
1256 return (-1);
1257 }
1258 if ((bpf_u_int32)p->snapshot != idbp->snaplen) {
1259 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1260 "an interface has a snapshot length %u different from the type of the first interface",
1261 idbp->snaplen);
1262 return (-1);
1263 }
1264
1265 /*
1266 * Try to add this interface.
1267 */
1268 if (!add_interface(p, &cursor, p->errbuf))
1269 return (-1);
1270 break;
1271
1272 case BT_SHB:
1273 /*
1274 * Section Header Block. Get a pointer
1275 * to its fixed-length portion.
1276 */
1277 shbp = get_from_block_data(&cursor, sizeof(*shbp),
1278 p->errbuf);
1279 if (shbp == NULL)
1280 return (-1); /* error */
1281
1282 /*
1283 * Assume the byte order of this section is
1284 * the same as that of the previous section.
1285 * We'll check for that later.
1286 */
1287 if (p->swapped) {
1288 shbp->byte_order_magic =
1289 SWAPLONG(shbp->byte_order_magic);
1290 shbp->major_version =
1291 SWAPSHORT(shbp->major_version);
1292 }
1293
1294 /*
1295 * Make sure the byte order doesn't change;
1296 * pcap_is_swapped() shouldn't change its
1297 * return value in the middle of reading a capture.
1298 */
1299 switch (shbp->byte_order_magic) {
1300
1301 case BYTE_ORDER_MAGIC:
1302 /*
1303 * OK.
1304 */
1305 break;
1306
1307 case SWAPLONG(BYTE_ORDER_MAGIC):
1308 /*
1309 * Byte order changes.
1310 */
1311 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1312 "the file has sections with different byte orders");
1313 return (-1);
1314
1315 default:
1316 /*
1317 * Not a valid SHB.
1318 */
1319 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1320 "the file has a section with a bad byte order magic field");
1321 return (-1);
1322 }
1323
1324 /*
1325 * Make sure the major version is the version
1326 * we handle.
1327 */
1328 if (shbp->major_version != PCAP_NG_VERSION_MAJOR) {
1329 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1330 "unknown pcapng savefile major version number %u",
1331 shbp->major_version);
1332 return (-1);
1333 }
1334
1335 /*
1336 * Reset the interface count; this section should
1337 * have its own set of IDBs. If any of them
1338 * don't have the same interface type, snapshot
1339 * length, or resolution as the first interface
1340 * we saw, we'll fail. (And if we don't see
1341 * any IDBs, we'll fail when we see a packet
1342 * block.)
1343 */
1344 ps->ifcount = 0;
1345 break;
1346
1347 default:
1348 /*
1349 * Not a packet block, IDB, or SHB; ignore it.
1350 */
1351 break;
1352 }
1353 }
1354
1355 found:
1356 /*
1357 * Is the interface ID an interface we know?
1358 */
1359 if (interface_id >= ps->ifcount) {
1360 /*
1361 * Yes. Fail.
1362 */
1363 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1364 "a packet arrived on interface %u, but there's no Interface Description Block for that interface",
1365 interface_id);
1366 return (-1);
1367 }
1368
1369 if (hdr->caplen > (bpf_u_int32)p->snapshot) {
1370 pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1371 "invalid packet capture length %u, bigger than "
1372 "snaplen of %d", hdr->caplen, p->snapshot);
1373 return (-1);
1374 }
1375
1376 /*
1377 * Convert the time stamp to seconds and fractions of a second,
1378 * with the fractions being in units of the file-supplied resolution.
1379 */
1380 sec = t / ps->ifaces[interface_id].tsresol + ps->ifaces[interface_id].tsoffset;
1381 frac = t % ps->ifaces[interface_id].tsresol;
1382
1383 /*
1384 * Convert the fractions from units of the file-supplied resolution
1385 * to units of the user-requested resolution.
1386 */
1387 switch (ps->ifaces[interface_id].scale_type) {
1388
1389 case PASS_THROUGH:
1390 /*
1391 * The interface resolution is what the user wants,
1392 * so we're done.
1393 */
1394 break;
1395
1396 case SCALE_UP_DEC:
1397 /*
1398 * The interface resolution is less than what the user
1399 * wants; scale the fractional part up to the units of
1400 * the resolution the user requested by multiplying by
1401 * the quotient of the user-requested resolution and the
1402 * file-supplied resolution.
1403 *
1404 * Those resolutions are both powers of 10, and the user-
1405 * requested resolution is greater than the file-supplied
1406 * resolution, so the quotient in question is an integer.
1407 * We've calculated that quotient already, so we just
1408 * multiply by it.
1409 */
1410 frac *= ps->ifaces[interface_id].scale_factor;
1411 break;
1412
1413 case SCALE_UP_BIN:
1414 /*
1415 * The interface resolution is less than what the user
1416 * wants; scale the fractional part up to the units of
1417 * the resolution the user requested by multiplying by
1418 * the quotient of the user-requested resolution and the
1419 * file-supplied resolution.
1420 *
1421 * The file-supplied resolution is a power of 2, so the
1422 * quotient is not an integer, so, in order to do this
1423 * entirely with integer arithmetic, we multiply by the
1424 * user-requested resolution and divide by the file-
1425 * supplied resolution.
1426 *
1427 * XXX - Is there something clever we could do here,
1428 * given that we know that the file-supplied resolution
1429 * is a power of 2? Doing a multiplication followed by
1430 * a division runs the risk of overflowing, and involves
1431 * two non-simple arithmetic operations.
1432 */
1433 frac *= ps->user_tsresol;
1434 frac /= ps->ifaces[interface_id].tsresol;
1435 break;
1436
1437 case SCALE_DOWN_DEC:
1438 /*
1439 * The interface resolution is greater than what the user
1440 * wants; scale the fractional part up to the units of
1441 * the resolution the user requested by multiplying by
1442 * the quotient of the user-requested resolution and the
1443 * file-supplied resolution.
1444 *
1445 * Those resolutions are both powers of 10, and the user-
1446 * requested resolution is less than the file-supplied
1447 * resolution, so the quotient in question isn't an
1448 * integer, but its reciprocal is, and we can just divide
1449 * by the reciprocal of the quotient. We've calculated
1450 * the reciprocal of that quotient already, so we must
1451 * divide by it.
1452 */
1453 frac /= ps->ifaces[interface_id].scale_factor;
1454 break;
1455
1456
1457 case SCALE_DOWN_BIN:
1458 /*
1459 * The interface resolution is greater than what the user
1460 * wants; convert the fractional part to units of the
1461 * resolution the user requested by multiplying by the
1462 * quotient of the user-requested resolution and the
1463 * file-supplied resolution. We do that by multiplying
1464 * by the user-requested resolution and dividing by the
1465 * file-supplied resolution, as the quotient might not
1466 * fit in an integer.
1467 *
1468 * The file-supplied resolution is a power of 2, so the
1469 * quotient is not an integer, and neither is its
1470 * reciprocal, so, in order to do this entirely with
1471 * integer arithmetic, we multiply by the user-requested
1472 * resolution and divide by the file-supplied resolution.
1473 *
1474 * XXX - Is there something clever we could do here,
1475 * given that we know that the file-supplied resolution
1476 * is a power of 2? Doing a multiplication followed by
1477 * a division runs the risk of overflowing, and involves
1478 * two non-simple arithmetic operations.
1479 */
1480 frac *= ps->user_tsresol;
1481 frac /= ps->ifaces[interface_id].tsresol;
1482 break;
1483 }
1484 #ifdef _WIN32
1485 /*
1486 * tv_sec and tv_used in the Windows struct timeval are both
1487 * longs.
1488 */
1489 hdr->ts.tv_sec = (long)sec;
1490 hdr->ts.tv_usec = (long)frac;
1491 #else
1492 /*
1493 * tv_sec in the UN*X struct timeval is a time_t; tv_usec is
1494 * suseconds_t in UN*Xes that work the way the current Single
1495 * UNIX Standard specify - but not all older UN*Xes necessarily
1496 * support that type, so just cast to int.
1497 */
1498 hdr->ts.tv_sec = (time_t)sec;
1499 hdr->ts.tv_usec = (int)frac;
1500 #endif
1501
1502 /*
1503 * Get a pointer to the packet data.
1504 */
1505 *data = get_from_block_data(&cursor, hdr->caplen, p->errbuf);
1506 if (*data == NULL)
1507 return (-1);
1508
1509 if (p->swapped)
1510 swap_pseudo_headers(p->linktype, hdr, *data);
1511
1512 return (0);
1513 }