    /*====================================================================*
     *
     *   Copyright (c) 2013 Qualcomm Atheros, Inc.
     *
     *   All rights reserved.
     *
     *   Redistribution and use in source and binary forms, with or
     *   without modification, are permitted (subject to the limitations
     *   in the disclaimer below) provided that the following conditions
     *   are met:
     *
     *   * Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   * Redistributions in binary form must reproduce the above
     *     copyright notice, this list of conditions and the following
     *     disclaimer in the documentation and/or other materials
     *     provided with the distribution.
     *
     *   * Neither the name of Qualcomm Atheros nor the names of
     *     its contributors may be used to endorse or promote products
     *     derived from this software without specific prior written
     *     permission.
     *
     *   NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
     *   GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
     *   COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
     *   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     *   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     *   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
     *   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     *   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     *   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     *   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *--------------------------------------------------------------------*/

    /*====================================================================*
     *
     *   channel.h - raw packet channel definitions and declarations;
     *
     *   the channel structure contains information needed to perform
     *   ISO Layer 2, raw packet I/O in a variety of environments;
     *
     *.  Qualcomm Atheros HomePlug AV Powerline Toolkit
     *:  Copyright (c) 2009-2013 by Qualcomm Atheros Inc. ALL RIGHTS RESERVED;
     *;  For demonstration and evaluation only; Not for production use.
     *
     *   Contributor(s):
     *      Charles Maier <cmaier@qca.qualcomm.com>
     *      Nathaniel Houghton <nathaniel.houghton@qca.qualcomm.com>
     *
     *--------------------------------------------------------------------*/

    #ifndef CHANNEL_HEADER
    #define CHANNEL_HEADER

    /*====================================================================*
     *  system header files;
     *--------------------------------------------------------------------*/

    #include <unistd.h>

    /*====================================================================*
     *  custom header files;
     *--------------------------------------------------------------------*/

    #include "../ether/ether.h"
    #include "../tools/types.h"

    /*====================================================================*
     *   sort out the raw socket mess;
     *--------------------------------------------------------------------*/

    #if defined (__linux__) || defined (__APPLE__) || defined (__OpenBSD__)
    #       ifdef WINPCAP
    #               error "Don't enable winpcap on Linux. It won't work."
    #               endif
    #       ifdef LIBPCAP
    #               error "Don't enable libpcap on Linux. You don't need it."
    #               endif
    #elif defined (WIN32)
    #       ifndef WINPCAP
    #               error "Define preprocessor constant WINPCAP on Windows."
    #               endif
    #       ifdef LIBPCAP
    #               error "Don't enable libpcap on Windows. It won't work."
    #               endif
    #elif defined (__CYGWIN__)
    # 	error "cygwin is unsupported!"
    #else
    #       error "unknown environment"
    #endif

    /*====================================================================*
     *   channel flagword bitmasks;
     *--------------------------------------------------------------------*/

    #define CHANNEL_VERBOSE (1 << 0)
    #define CHANNEL_SILENCE (1 << 1)
    #define CHANNEL_WARNING (1 << 2)
    #define CHANNEL_SUCCESS (1 << 3)
    #define CHANNEL_FAILURE (1 << 4)
    #define CHANNEL_MONITOR (1 << 5)

    #define CHANNEL_UPDATE_TARGET (1 << 5) /* used by efsu only */
    #define CHANNEL_UPDATE_SOURCE (1 << 6) /* used by efsu only */
    #define CHANNEL_LISTEN (1 << 7)        /* used by efsu only */

    #define CHANNEL_ETHNUMBER 2
    #if defined (__linux__)
    #       define CHANNEL_ETHDEVICE "eth1"
    #elif defined (__APPLE__)
    #       define CHANNEL_ETHDEVICE "en0"
    #       define CHANNEL_BPFDEVICE "/dev/bpf%d"
    #elif defined (__OpenBSD__)
    #       define CHANNEL_ETHDEVICE "bce0"
    #       define CHANNEL_BPFDEVICE "/dev/bpf%d"
    #else
    #       define CHANNEL_ETHDEVICE "nic1"
    #endif

    #define CHANNEL_FOREVER (unsigned)(-1)
    #define CHANNEL_BAILOUT 0
    #define CHANNEL_FLAGS 0

    #if defined (WIN32)
    #define CHANNEL_CAPTURE 50
    #define CHANNEL_TIMEOUT 200
    #else
    #define CHANNEL_CAPTURE 15
    #define CHANNEL_TIMEOUT 50
    #endif

    /*====================================================================*
     *   common channel error messages;
     *--------------------------------------------------------------------*/

    #define CHANNEL_CANTSEND "%s: Send timeout or network error", __func__
    #define CHANNEL_CANTREAD "%s: Read timeout or network error", __func__

    /*====================================================================*
     *   channel ethertype definitions;
     *--------------------------------------------------------------------*/

    #if !defined (__linux__)
    #       define ETH_P_802_2 1
    #endif

    /*====================================================================*
     *   communication channel structure;
     *--------------------------------------------------------------------*/

    typedef struct channel

    {
    	signed fd;
    	signed ifstate;
    	signed ifindex;
    	char const * ifname;
    	uint8_t peer [ETHER_ADDR_LEN];
    	uint8_t host [ETHER_ADDR_LEN];
    	uint16_t type;

    #if defined (__linux__)

    #elif defined (__APPLE__) || defined (__OpenBSD__)

    	struct bpf
    	{
    		signed bpf_length;
    		uint8_t * bpf_buffer;
    		uint8_t * bpf_bp;
    		signed bpf_bufused;
    	}
    	* bpf;

    #elif defined (WINPCAP) || defined (LIBPCAP)

    	pcap_t * socket;
    	char errbuf [PCAP_ERRBUF_SIZE];

    #else
    #error "Unknown Environment"
    #endif

    	signed capture;
    	signed timeout;
    	flag_t flags;
    }

    CHANNEL;

    /*====================================================================*
     *   channel functions;
     *--------------------------------------------------------------------*/

    signed openchannel (struct channel *);
    signed closechannel (struct channel const *);
    ssize_t sendpacket (struct channel const *, void * memory, ssize_t extent);
    ssize_t readpacket (struct channel const *, void * memory, ssize_t extent);

    /*====================================================================*
     *
     *--------------------------------------------------------------------*/

    #endif

[PREV] [HOME] [NEXT]