Changeset 528eb6e for lib


Ignore:
Timestamp:
12/04/12 15:24:34 (9 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
b4c3f61
Parents:
fd87898
Message:
  • A very cut-down version of int: and ring: is now built on non-Linux systems, enabling them to be able to decode packets captured using those formats and exported via RT
  • Replaced arphrd.h with a new header file (libtrace_arphrd.h) that provides our own #defines for the various ARPHRD types. The inconsistency between what is available on different OS's was becoming problematic.
  • Increased RT buffer size so we can always fit a complete libtrace buffer into it - int: over RT tends to result in very large "packets".
  • Fixed copy-paste error in the failure case when creating a dummy linux trace in format_rt.c
  • Updated various bits of code to use the new LIBTRACE_ARPHRD types where sensible
  • Removed unneeded #include in protocols_pktmeta.c
  • Replaced u32 and u16 types in format_linux with more portable uint32_t and uint16_t types
  • Removed unneeded calls to linuxnative_init_input in the prepare_packet functions in format_linux.c
  • Don't call the fin_input function on a trace if the format does not provide one
Location:
lib
Files:
1 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • lib/Makefile.am

    r60f3c4c r528eb6e  
    11lib_LTLIBRARIES = libtrace.la
    2 include_HEADERS = libtrace.h dagformat.h lt_inttypes.h daglegacy.h rt_protocol.h erftypes.h
     2include_HEADERS = libtrace.h dagformat.h lt_inttypes.h daglegacy.h rt_protocol.h erftypes.h  
    33
    44AM_CFLAGS=@LIBCFLAGS@
     
    66
    77extra_DIST = format_template.c
    8 if HAVE_NETPACKET_PACKET_H
    98NATIVEFORMATS=format_linux.c
    10 else
    11 NATIVEFORMATS=
    12 endif
    139
    1410if HAVE_BPF_CAPTURE
     
    4743                $(DAGSOURCE) format_erf.h \
    4844                $(BPFJITSOURCE) \
    49                 arphrd.h
     45                libtrace_arphrd.h
    5046
    5147if DAG2_4
  • lib/format_linux.c

    rf240823 r528eb6e  
    3333 */
    3434
    35 
    36 #include "libtrace.h"
    37 #include "libtrace_int.h"
    38 #include "format_helper.h"
    39 #include "config.h"
    40 #include <stdlib.h>
    41 
    42 #ifdef HAVE_INTTYPES_H
    43 #  include <inttypes.h>
    44 #else
    45 # error "Can't find inttypes.h"
    46 #endif
    47 
    48 #include <sys/socket.h>
    49 #include <netpacket/packet.h>
    50 #include <net/ethernet.h>
    51 #include <net/if_arp.h>
    52 
    53 #include <string.h>
    54 #include <net/if.h>
    55 #include <sys/ioctl.h>
    56 #include <errno.h>
    57 #include <unistd.h>
    58 
    59 #include <assert.h>
    60 
    61 #include <poll.h>
    62 #include <sys/mman.h>
    63 
    6435/* This format module deals with using the Linux Native capture format.
    6536 *
     
    7243 */
    7344
    74 /* Declared in linux/if_arp.h but not in net/if_arp.h sigh */
    75 #ifndef ARPHRD_NONE
    76 #define ARPHRD_NONE 0xfffe
    77 #endif
     45#include "config.h"
     46#include "libtrace.h"
     47#include "libtrace_int.h"
     48#include "format_helper.h"
     49#include "libtrace_arphrd.h"
     50#include <stdlib.h>
     51#include <errno.h>
     52#include <unistd.h>
     53#include <string.h>
     54#include <assert.h>
     55
     56#ifdef HAVE_INTTYPES_H
     57#  include <inttypes.h>
     58#else
     59# error "Can't find inttypes.h"
     60#endif
     61
     62#ifdef HAVE_NETPACKET_PACKET_H_
     63
     64#include <sys/socket.h>
     65#include <netpacket/packet.h>
     66#include <net/ethernet.h>
     67#include <net/if_arp.h>
     68
     69#include <net/if.h>
     70#include <sys/ioctl.h>
     71#include <poll.h>
     72#include <sys/mman.h>
     73
     74/* MAX_ORDER is defined in linux/mmzone.h. 10 is default for 2.4 kernel.
     75 * max_order will be decreased by one if the ring buffer fails to allocate.
     76 * Used to get correct sized buffers from the kernel.
     77 */
     78#define MAX_ORDER 10
     79static unsigned int max_order = MAX_ORDER;
     80
     81/* Cached page size, the page size shoudn't be changing */
     82static int pagesize = 0;
     83
     84/* Number of frames in the ring used by both TX and TR rings. More frames
     85 * hopefully means less packet loss, especially if traffic comes in bursts.
     86 */
     87#define CONF_RING_FRAMES        0x100
     88
     89/* The maximum frames allowed to be waiting in the TX_RING before the kernel is
     90 * notified to write them out. Make sure this is less than CONF_RING_FRAMES.
     91 * Performance doesn't seem to increase any more when setting this above 10.
     92 */
     93#define TX_MAX_QUEUE            10
     94
     95/* Get current frame in the ring buffer*/
     96#define GET_CURRENT_BUFFER(libtrace) ((void *) FORMAT(libtrace->format_data)->rx_ring + \
     97        (FORMAT(libtrace->format_data)->rxring_offset * FORMAT(libtrace->format_data)->req.tp_frame_size))
     98
     99
     100#else   /* HAVE_NETPACKET_PACKET_H */
     101/* Need to know what a sockaddr_ll looks like */
     102struct sockaddr_ll {
     103        uint16_t sll_family;
     104        uint16_t sll_protocol;
     105        int32_t  sll_ifindex;
     106        uint16_t sll_hatype;
     107        uint8_t  sll_pkttype;
     108        uint8_t  sll_halen;
     109        uint8_t  sll_addr[8];
     110};
     111
     112/* Packet types.  */
     113
     114#define PACKET_HOST             0               /* To us.  */
     115#define PACKET_BROADCAST        1               /* To all.  */
     116#define PACKET_MULTICAST        2               /* To group.  */
     117#define PACKET_OTHERHOST        3               /* To someone else.  */
     118#define PACKET_OUTGOING         4               /* Originated by us . */
     119#define PACKET_LOOPBACK         5
     120#define PACKET_FASTROUTE        6
     121
     122/* Packet socket options.  */
     123
     124#define PACKET_ADD_MEMBERSHIP           1
     125#define PACKET_DROP_MEMBERSHIP          2
     126#define PACKET_RECV_OUTPUT              3
     127#define PACKET_RX_RING                  5
     128#define PACKET_STATISTICS               6
     129
     130
     131#endif /* HAVE_NETPACKET_PACKET_H_ */
    78132
    79133struct tpacket_stats {
     
    107161struct tpacket2_hdr {
    108162        /* Frame status - in use by kernel or libtrace etc. */
    109         __u32   tp_status;
     163        uint32_t        tp_status;
    110164        /* Wire length */
    111         __u32   tp_len;
     165        uint32_t        tp_len;
    112166        /* Captured length */
    113         __u32   tp_snaplen;
     167        uint32_t        tp_snaplen;
    114168        /* Offset in bytes from frame start to the mac (link layer) header */
    115         __u16   tp_mac;
     169        uint16_t        tp_mac;
    116170        /* Offset in bytes from frame start to the net (network layer) header */
    117         __u16   tp_net;
     171        uint16_t        tp_net;
    118172        /* Timestamp */
    119         __u32   tp_sec;
    120         __u32   tp_nsec;
     173        uint32_t        tp_sec;
     174        uint32_t        tp_nsec;
    121175        /* Not used VLAN tag control information */
    122         __u16   tp_vlan_tci;
    123         __u16   tp_padding;
     176        uint16_t        tp_vlan_tci;
     177        uint16_t        tp_padding;
    124178};
    125179
     
    202256};
    203257
    204 /* MAX_ORDER is defined in linux/mmzone.h. 10 is default for 2.4 kernel.
    205  * max_order will be decreased by one if the ring buffer fails to allocate.
    206  * Used to get correct sized buffers from the kernel.
    207  */
    208 #define MAX_ORDER 10
    209 static unsigned int max_order = MAX_ORDER;
    210 
    211 /* Cached page size, the page size shoudn't be changing */
    212 static int pagesize = 0;
    213 
    214 /* Number of frames in the ring used by both TX and TR rings. More frames
    215  * hopefully means less packet loss, especially if traffic comes in bursts.
    216  */
    217 #define CONF_RING_FRAMES        0x100
    218 
    219 /* The maximum frames allowed to be waiting in the TX_RING before the kernel is
    220  * notified to write them out. Make sure this is less than CONF_RING_FRAMES.
    221  * Performance doesn't seem to increase any more when setting this above 10.
    222  */
    223 #define TX_MAX_QUEUE            10
     258/* Get the sockaddr_ll structure from a frame */
     259#define GET_SOCKADDR_HDR(x)  ((struct sockaddr_ll *) (((char *) (x))\
     260        + TPACKET_ALIGN(sizeof(struct tpacket2_hdr))))
     261
     262#define TPACKET_HDRLEN TPACKET2_HDRLEN
     263
     264#define FORMAT(x) ((struct linux_format_data_t*)(x))
     265#define DATAOUT(x) ((struct linux_output_format_data_t*)((x)->format_data))
    224266
    225267/* Get the start of the captured data. I'm not sure if tp_mac (link layer) is
     
    229271        ((mac) > (hdrend) && (mac) < (net) ? (mac) : (net))
    230272
    231 /* Get current frame in the ring buffer*/
    232 #define GET_CURRENT_BUFFER(libtrace) ((void *) FORMAT(libtrace->format_data)->rx_ring + \
    233         (FORMAT(libtrace->format_data)->rxring_offset * FORMAT(libtrace->format_data)->req.tp_frame_size))
    234 
    235 /* Get the sockaddr_ll structure from a frame */
    236 #define GET_SOCKADDR_HDR(x)  ((struct sockaddr_ll *) (((char *) (x))\
    237         + TPACKET_ALIGN(sizeof(struct tpacket2_hdr))))
    238 
    239 #define TPACKET_HDRLEN TPACKET2_HDRLEN
    240 
    241 #define FORMAT(x) ((struct linux_format_data_t*)(x))
    242 #define DATAOUT(x) ((struct linux_output_format_data_t*)((x)->format_data))
    243 
     273
     274#ifdef HAVE_NETPACKET_PACKET_H_
    244275
    245276/*
     
    309340        assert(req->tp_block_size % req->tp_frame_size == 0);
    310341}
     342
    311343
    312344static int linuxnative_probe_filename(const char *filename)
     
    748780        return -1;
    749781}
    750 
    751 static int linuxnative_prepare_packet(libtrace_t *libtrace,
     782#endif /* HAVE_NETPACKET_PACKET_H_ */
     783
     784static int linuxnative_prepare_packet(libtrace_t *libtrace UNUSED,
    752785                libtrace_packet_t *packet, void *buffer,
    753786                libtrace_rt_types_t rt_type, uint32_t flags) {
     
    770803        packet->type = rt_type;
    771804
     805        /*
    772806        if (libtrace->format_data == NULL) {
    773807                if (linuxnative_init_input(libtrace))
    774808                        return -1;
    775809        }
     810        */
    776811        return 0;
    777812       
    778813}
    779814
    780 static int linuxring_prepare_packet(libtrace_t *libtrace,
     815static int linuxring_prepare_packet(libtrace_t *libtrace UNUSED,
    781816                libtrace_packet_t *packet, void *buffer,
    782817                libtrace_rt_types_t rt_type, uint32_t flags) {
     
    802837        packet->type = rt_type;
    803838
     839        /*
    804840        if (libtrace->format_data == NULL) {
    805841                if (linuxnative_init_input(libtrace))
    806842                        return -1;
    807843        }
     844        */
    808845        return 0;
    809846       
     
    814851/* 20 isn't enough on x86_64 */
    815852#define CMSG_BUF_SIZE 128
     853
     854#ifdef HAVE_NETPACKET_PACKET_H_
    816855static int linuxnative_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet)
    817856{
     
    11281167
    11291168}
     1169#endif /* HAVE_NETPACKET_PACKET_H_ */
    11301170
    11311171static inline libtrace_linktype_t get_libtrace_link_type(uint16_t linktype){
    11321172        /* Convert the ARPHRD type into an appropriate libtrace link type */
    11331173        switch (linktype) {
    1134                 case ARPHRD_ETHER:
    1135                 case ARPHRD_LOOPBACK:
     1174                case LIBTRACE_ARPHRD_ETHER:
     1175                case LIBTRACE_ARPHRD_LOOPBACK:
    11361176                        return TRACE_TYPE_ETH;
    1137                 case ARPHRD_PPP:
     1177                case LIBTRACE_ARPHRD_PPP:
    11381178                        return TRACE_TYPE_NONE;
    1139                 case ARPHRD_80211_RADIOTAP:
     1179                case LIBTRACE_ARPHRD_IEEE80211_RADIOTAP:
    11401180                        return TRACE_TYPE_80211_RADIO;
    1141                 case ARPHRD_IEEE80211:
     1181                case LIBTRACE_ARPHRD_IEEE80211:
    11421182                        return TRACE_TYPE_80211;
    1143                 case ARPHRD_SIT:
    1144                 case ARPHRD_NONE:
     1183                case LIBTRACE_ARPHRD_SIT:
     1184                case LIBTRACE_ARPHRD_NONE:
    11451185                        return TRACE_TYPE_NONE;
    11461186                default: /* shrug, beyond me! */
     
    13591399                return UINT64_MAX;
    13601400        }
    1361        
     1401
     1402#ifdef HAVE_NETPACKET_PACKET_H_
    13621403        if ((FORMAT(trace->format_data)->stats_valid & 1)
    13631404                        || FORMAT(trace->format_data)->stats_valid == 0) {
     
    13721413
    13731414        return FORMAT(trace->format_data)->stats.tp_packets;
     1415#else
     1416        return UINT64_MAX;
     1417#endif
    13741418}
    13751419
     
    13861430        }
    13871431       
     1432#ifdef HAVE_NETPACKET_PACKET_H_
    13881433        if ((FORMAT(trace->format_data)->stats_valid & 2)
    13891434                        || (FORMAT(trace->format_data)->stats_valid==0)) {
     
    13981443
    13991444        return FORMAT(trace->format_data)->stats.tp_drops;
    1400 }
    1401 
     1445#else
     1446        return UINT64_MAX;
     1447#endif
     1448}
     1449
     1450#ifdef HAVE_NETPACKET_PACKET_H_
    14021451static void linuxnative_help(void) {
    14031452        printf("linuxnative format module: $Revision$\n");
     
    14601509        linuxnative_get_captured_packets,/* get_captured_packets */
    14611510        linuxnative_get_fd,             /* get_fd */
    1462         trace_event_device,             /* trace_event */
     1511        NULL,                           /* trace_event */
    14631512        linuxnative_help,               /* help */
    14641513        NULL
     
    15071556        NULL
    15081557};
     1558#else
     1559static void linuxnative_help(void) {
     1560        printf("linuxnative format module: $Revision$\n");
     1561        printf("Not supported on this host\n");
     1562}
     1563static void linuxring_help(void) {
     1564        printf("linuxring format module: $Revision$\n");
     1565        printf("Not supported on this host\n");
     1566}
     1567
     1568static struct libtrace_format_t linuxnative = {
     1569        "int",
     1570        "$Id$",
     1571        TRACE_FORMAT_LINUX_NATIVE,
     1572        NULL,                           /* probe filename */
     1573        NULL,                           /* probe magic */
     1574        NULL,                           /* init_input */
     1575        NULL,                           /* config_input */
     1576        NULL,                           /* start_input */
     1577        NULL,                           /* pause_input */
     1578        NULL,                           /* init_output */
     1579        NULL,                           /* config_output */
     1580        NULL,                           /* start_ouput */
     1581        NULL,                           /* fin_input */
     1582        NULL,                           /* fin_output */
     1583        NULL,                           /* read_packet */
     1584        linuxnative_prepare_packet,     /* prepare_packet */
     1585        NULL,                           /* fin_packet */
     1586        NULL,                           /* write_packet */
     1587        linuxnative_get_link_type,      /* get_link_type */
     1588        linuxnative_get_direction,      /* get_direction */
     1589        linuxnative_set_direction,      /* set_direction */
     1590        NULL,                           /* get_erf_timestamp */
     1591        linuxnative_get_timeval,        /* get_timeval */
     1592        linuxnative_get_timespec,       /* get_timespec */
     1593        NULL,                           /* get_seconds */
     1594        NULL,                           /* seek_erf */
     1595        NULL,                           /* seek_timeval */
     1596        NULL,                           /* seek_seconds */
     1597        linuxnative_get_capture_length, /* get_capture_length */
     1598        linuxnative_get_wire_length,    /* get_wire_length */
     1599        linuxnative_get_framing_length, /* get_framing_length */
     1600        linuxnative_set_capture_length, /* set_capture_length */
     1601        NULL,                           /* get_received_packets */
     1602        linuxnative_get_filtered_packets,/* get_filtered_packets */
     1603        linuxnative_get_dropped_packets,/* get_dropped_packets */
     1604        linuxnative_get_captured_packets,/* get_captured_packets */
     1605        linuxnative_get_fd,             /* get_fd */
     1606        trace_event_device,             /* trace_event */
     1607        linuxnative_help,               /* help */
     1608        NULL
     1609};
     1610
     1611static struct libtrace_format_t linuxring = {
     1612        "ring",
     1613        "$Id$",
     1614        TRACE_FORMAT_LINUX_RING,
     1615        NULL,                           /* probe filename */
     1616        NULL,                           /* probe magic */
     1617        NULL,                           /* init_input */
     1618        NULL,                           /* config_input */
     1619        NULL,                           /* start_input */
     1620        NULL,                           /* pause_input */
     1621        NULL,                           /* init_output */
     1622        NULL,                           /* config_output */
     1623        NULL,                           /* start_ouput */
     1624        NULL,                           /* fin_input */
     1625        NULL,                           /* fin_output */
     1626        NULL,                           /* read_packet */
     1627        linuxring_prepare_packet,       /* prepare_packet */
     1628        NULL,                           /* fin_packet */
     1629        NULL,                           /* write_packet */
     1630        linuxring_get_link_type,        /* get_link_type */
     1631        linuxring_get_direction,        /* get_direction */
     1632        linuxring_set_direction,        /* set_direction */
     1633        NULL,                           /* get_erf_timestamp */
     1634        linuxring_get_timeval,          /* get_timeval */
     1635        linuxring_get_timespec,         /* get_timespec */
     1636        NULL,                           /* get_seconds */
     1637        NULL,                           /* seek_erf */
     1638        NULL,                           /* seek_timeval */
     1639        NULL,                           /* seek_seconds */
     1640        linuxring_get_capture_length,   /* get_capture_length */
     1641        linuxring_get_wire_length,      /* get_wire_length */
     1642        linuxring_get_framing_length,   /* get_framing_length */
     1643        linuxring_set_capture_length,   /* set_capture_length */
     1644        NULL,                           /* get_received_packets */
     1645        linuxnative_get_filtered_packets,/* get_filtered_packets */
     1646        linuxnative_get_dropped_packets,/* get_dropped_packets */
     1647        linuxnative_get_captured_packets,/* get_captured_packets */
     1648        linuxnative_get_fd,             /* get_fd */
     1649        NULL,                           /* trace_event */
     1650        linuxring_help,                 /* help */
     1651        NULL
     1652};
     1653
     1654#endif /* HAVE_NETPACKET_PACKET_H */
     1655
    15091656
    15101657void linuxnative_constructor(void) {
  • lib/format_rt.c

    rfd87898 r528eb6e  
    310310 * is pretty nasty, but also very rare.
    311311 */
    312 #define RT_BUF_SIZE 10000U
     312#define RT_BUF_SIZE (LIBTRACE_PACKET_BUFSIZE * 2)
    313313
    314314/* Receives data from an RT server */
     
    441441                                /* This may fail on a non-Linux machine */
    442442                                if (trace_is_err(RT_INFO->dummy_linux)) {
    443                                         trace_perror(RT_INFO->dummy_linux, "Creating dead bpf trace");
     443                                        trace_perror(RT_INFO->dummy_linux, "Creating dead int trace");
    444444                                        return -1;
    445445                                }
  • lib/linktypes.c

    re1f3b6b r528eb6e  
    4141#include <string.h>
    4242
    43 #include "arphrd.h"
     43#include "libtrace_arphrd.h"
    4444
    4545
     
    207207libtrace_linktype_t arphrd_type_to_libtrace(unsigned int arphrd) {
    208208        switch(arphrd) {
    209                 case ARPHRD_ETHER: return TRACE_TYPE_ETH;       
    210                 case ARPHRD_EETHER: return TRACE_TYPE_ETH;     
    211                 case ARPHRD_IEEE80211: return TRACE_TYPE_80211;
    212                 case ARPHRD_80211_RADIOTAP: return TRACE_TYPE_80211_RADIO;
    213                 case ARPHRD_PPP: return TRACE_TYPE_NONE;
    214                 case ARPHRD_LOOPBACK: return TRACE_TYPE_ETH;
    215                 case ARPHRD_NONE: return TRACE_TYPE_NONE;
     209                case LIBTRACE_ARPHRD_ETHER: return TRACE_TYPE_ETH;     
     210                case LIBTRACE_ARPHRD_EETHER: return TRACE_TYPE_ETH;     
     211                case LIBTRACE_ARPHRD_IEEE80211: return TRACE_TYPE_80211;
     212                case LIBTRACE_ARPHRD_IEEE80211_RADIOTAP: return TRACE_TYPE_80211_RADIO;
     213                case LIBTRACE_ARPHRD_PPP: return TRACE_TYPE_NONE;
     214                case LIBTRACE_ARPHRD_LOOPBACK: return TRACE_TYPE_ETH;
     215                case LIBTRACE_ARPHRD_NONE: return TRACE_TYPE_NONE;
    216216        }
    217217        printf("Unknown ARPHRD %08x\n",arphrd);
     
    221221unsigned int libtrace_to_arphrd_type(libtrace_linktype_t linktype) {
    222222        switch(linktype) {
    223                 case TRACE_TYPE_ETH: return ARPHRD_ETHER;
    224                 case TRACE_TYPE_80211: return ARPHRD_IEEE80211;
    225                 case TRACE_TYPE_80211_RADIO: return ARPHRD_80211_RADIOTAP;
     223                case TRACE_TYPE_ETH: return LIBTRACE_ARPHRD_ETHER;
     224                case TRACE_TYPE_80211: return LIBTRACE_ARPHRD_IEEE80211;
     225                case TRACE_TYPE_80211_RADIO: return LIBTRACE_ARPHRD_IEEE80211_RADIOTAP;
    226226                default: break;
    227227        }
     
    266266                        case TRACE_TYPE_NONE:
    267267                                trace_get_layer3(packet, &hdr->protocol, NULL);
    268                                 hdr->hatype = htons(ARPHRD_PPP);
     268                                hdr->hatype = htons(LIBTRACE_ARPHRD_PPP);
    269269                                hdr->protocol=htons(hdr->protocol);
    270270                                break;
    271271                        case TRACE_TYPE_ETH:
    272                                 hdr->hatype = htons(ARPHRD_ETHER);
     272                                hdr->hatype = htons(LIBTRACE_ARPHRD_ETHER);
    273273                                hdr->protocol=htons(0x0060); /* ETH_P_LOOP */
    274274                                break;
     
    368368               
    369369                        /* Preserved from older libtrace behaviour */
    370                         if (ha_type == ARPHRD_PPP)
     370                        if (ha_type == LIBTRACE_ARPHRD_PPP)
    371371                                packet->type = pcap_linktype_to_rt(TRACE_DLT_RAW);
    372372                        /* Don't decide trace type based on ha_type,
  • lib/protocols_pktmeta.c

    r8ccb7897 r528eb6e  
    3636#include "protocols.h"
    3737#include <assert.h>
    38 
    39 #include "arphrd.h"
    4038
    4139/* This file contains all the protocol decoding functions for the meta-data
  • lib/trace.c

    r1935565 r528eb6e  
    136136                legacy_constructor();
    137137                atmhdr_constructor();
    138 #ifdef HAVE_NETPACKET_PACKET_H
    139138                linuxnative_constructor();
    140 #endif
    141139#ifdef HAVE_LIBPCAP
    142140                pcap_constructor();
     
    587585                if (libtrace->started && libtrace->format->pause_input)
    588586                        libtrace->format->pause_input(libtrace);
    589                 libtrace->format->fin_input(libtrace);
     587                if (libtrace->format->fin_input)
     588                        libtrace->format->fin_input(libtrace);
    590589        }
    591590        /* Need to free things! */
Note: See TracChangeset for help on using the changeset viewer.