/* $Id$ */
/* 
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJLIB_UTIL_PCAP_H__
#define __PJLIB_UTIL_PCAP_H__

/**
 * @file pcap.h
 * @brief Simple PCAP file reader
 */

#include <pj/types.h>

PJ_BEGIN_DECL

/**
 * @defgroup PJ_PCAP Simple PCAP file reader
 * @ingroup PJ_FILE_FMT
 * @{
 * This module describes simple utility to read PCAP file. It is not intended
 * to support all PCAP features (that's what libpcap is for!), but it can
 * be useful for example to playback or stream PCAP contents.
 */

/**
 * Enumeration to describe supported data link types.
 */
typedef enum pj_pcap_link_type
{
    /** Ethernet data link */
    PJ_PCAP_LINK_TYPE_ETH   = 1

} pj_pcap_link_type;


/**
 * Enumeration to describe supported protocol types.
 */
typedef enum pj_pcap_proto_type
{
    /** UDP protocol */
    PJ_PCAP_PROTO_TYPE_UDP  = 17

} pj_pcap_proto_type;


/**
 * This describes UDP header, which may optionally be returned in
 * #pj_pcap_read_udp() function. All fields are in network byte order.
 */
typedef struct pj_pcap_udp_hdr
{
    pj_uint16_t	src_port;   /**< Source port.	    */
    pj_uint16_t	dst_port;   /**< Destination port   */
    pj_uint16_t	len;	    /**< Length.	    */
    pj_uint16_t	csum;	    /**< Checksum.	    */
} pj_pcap_udp_hdr;


/**
 * This structure describes the filter to be used when reading packets from
 * a PCAP file. When a filter is configured, only packets matching all the
 * filter specifications will be read from PCAP file.
 */
typedef struct pj_pcap_filter
{
    /**
     * Select data link type, or zero to include any supported data links.
     */
    pj_pcap_link_type	link;

    /**
     * Select protocol, or zero to include all supported protocols.
     */
    pj_pcap_proto_type	proto;

    /**
     * Specify source IP address of the packets, or zero to include packets
     * from any IP addresses. Note that IP address here must be in
     * network byte order.
     */
    pj_uint32_t		ip_src;

    /**
     * Specify destination IP address of the packets, or zero to include packets
     * destined to any IP addresses. Note that IP address here must be in
     * network byte order.
     */
    pj_uint32_t		ip_dst;

    /**
     * Specify source port of the packets, or zero to include packets with
     * any source port number. Note that the port number must be in network
     * byte order.
     */
    pj_uint16_t		src_port;

    /**
     * Specify destination port of the packets, or zero to include packets with
     * any destination port number. Note that the port number must be in network
     * byte order.
     */
    pj_uint16_t		dst_port;

} pj_pcap_filter;


/** Opaque declaration for PCAP file */
typedef struct pj_pcap_file pj_pcap_file;


/**
 * Initialize filter with default values. The default value is to allow
 * any packets.
 *
 * @param filter    Filter to be initialized.
 */
PJ_DECL(void) pj_pcap_filter_default(pj_pcap_filter *filter);

/**
 * Open PCAP file.
 *
 * @param pool	    Pool to allocate memory.
 * @param path	    File/path name.
 * @param p_file    Pointer to receive PCAP file handle.
 *
 * @return	    PJ_SUCCESS if file can be opened successfully.
 */
PJ_DECL(pj_status_t) pj_pcap_open(pj_pool_t *pool,
				  const char *path,
				  pj_pcap_file **p_file);

/**
 * Close PCAP file.
 *
 * @param file	    PCAP file handle.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_pcap_close(pj_pcap_file *file);

/**
 * Configure filter for reading the file. When filter is configured,
 * only packets matching all the filter settings will be returned.
 *
 * @param file	    PCAP file handle.
 * @param filter    The filter.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_pcap_set_filter(pj_pcap_file *file,
				        const pj_pcap_filter *filter);

/**
 * Read UDP payload from the next packet in the PCAP file. Optionally it
 * can return the UDP header, if caller supplies it.
 *
 * @param file		    PCAP file handle.
 * @param udp_hdr	    Optional buffer to receive UDP header.
 * @param udp_payload	    Buffer to receive the UDP payload.
 * @param udp_payload_size  On input, specify the size of the buffer.
 *			    On output, it will be filled with the actual size
 *			    of the payload as read from the packet.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_pcap_read_udp(pj_pcap_file *file,
				      pj_pcap_udp_hdr *udp_hdr,
				      pj_uint8_t *udp_payload,
				      pj_size_t *udp_payload_size);


/**
 * @}
 */

PJ_END_DECL

#endif	/* __PJLIB_UTIL_PCAP_H__ */

