Blame include/libnet/libnet-macros.h

Packit 03b34a
/*
Packit 03b34a
 *  $Id: libnet-macros.h,v 1.7 2004/04/13 17:32:28 mike Exp $
Packit 03b34a
 *
Packit 03b34a
 *  libnet-macros.h - Network routine library macro header file
Packit 03b34a
 *
Packit 03b34a
 *  Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
Packit 03b34a
 *  All rights reserved.
Packit 03b34a
 *
Packit 03b34a
 * Redistribution and use in source and binary forms, with or without
Packit 03b34a
 * modification, are permitted provided that the following conditions
Packit 03b34a
 * are met:
Packit 03b34a
 * 1. Redistributions of source code must retain the above copyright
Packit 03b34a
 *    notice, this list of conditions and the following disclaimer.
Packit 03b34a
 * 2. Redistributions in binary form must reproduce the above copyright
Packit 03b34a
 *    notice, this list of conditions and the following disclaimer in the
Packit 03b34a
 *    documentation and/or other materials provided with the distribution.
Packit 03b34a
 *
Packit 03b34a
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit 03b34a
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit 03b34a
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 03b34a
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit 03b34a
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit 03b34a
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit 03b34a
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit 03b34a
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit 03b34a
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit 03b34a
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit 03b34a
 * SUCH DAMAGE.
Packit 03b34a
 *
Packit 03b34a
 */
Packit 03b34a
Packit 03b34a
#ifndef __LIBNET_MACROS_H
Packit 03b34a
#define __LIBNET_MACROS_H
Packit 03b34a
/**
Packit 03b34a
 * @file libnet-macros.h
Packit 03b34a
 * @brief libnet macros and symbolic constants
Packit 03b34a
 */
Packit 03b34a
Packit 03b34a
/* for systems without snprintf */
Packit 03b34a
#if defined(NO_SNPRINTF)
Packit 03b34a
#define snprintf(buf, len, args...) sprintf(buf, ##args)
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Used for libnet's name resolution functions, specifies that no DNS lookups
Packit 03b34a
 * should be performed and the IP address should be kept in numeric form.
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_DONT_RESOLVE 0
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Used for libnet's name resolution functions, specifies that a DNS lookup
Packit 03b34a
 * can be performed if needed to resolve the IP address to a canonical form.
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_RESOLVE      1
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Used several places, to specify "on" or "one"
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_ON	0
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Used several places, to specify "on" or "one"
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_OFF	1
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * IPv6 error code
Packit 03b34a
 */
Packit 03b34a
#ifndef IN6ADDR_ERROR_INIT
Packit 03b34a
#define IN6ADDR_ERROR_INIT { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
Packit 03b34a
                                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
Packit 03b34a
                                 0xff, 0xff } } }
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Used for libnet_get_prand() to specify function disposition
Packit 03b34a
 */ 
Packit 03b34a
#define LIBNET_PR2          0
Packit 03b34a
#define LIBNET_PR8          1
Packit 03b34a
#define LIBNET_PR16         2
Packit 03b34a
#define LIBNET_PRu16        3
Packit 03b34a
#define LIBNET_PR32         4
Packit 03b34a
#define LIBNET_PRu32        5
Packit 03b34a
#define LIBNET_PRAND_MAX    0xffffffff
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * The biggest an IP packet can be -- 65,535 bytes.
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_MAX_PACKET   0xffff
Packit 03b34a
#ifndef IP_MAXPACKET
Packit 03b34a
#define IP_MAXPACKET        0xffff
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
Packit 03b34a
/* ethernet addresses are 6 octets long */
Packit 03b34a
#ifndef ETHER_ADDR_LEN
Packit 03b34a
#define ETHER_ADDR_LEN      0x6
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/* FDDI addresses are 6 octets long */
Packit 03b34a
#ifndef FDDI_ADDR_LEN
Packit 03b34a
#define FDDI_ADDR_LEN       0x6
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/* token ring addresses are 6 octets long */
Packit 03b34a
#ifndef TOKEN_RING_ADDR_LEN
Packit 03b34a
#define TOKEN_RING_ADDR_LEN 0x6
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/* LLC Organization Code is 3 bytes long */
Packit 03b34a
#define LIBNET_ORG_CODE_SIZE  0x3
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * The libnet error buffer is 256 bytes long.
Packit 03b34a
 */ 
Packit 03b34a
#define LIBNET_ERRBUF_SIZE      0x100
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * IP and TCP options can be up to 40 bytes long.
Packit 03b34a
 */
Packit 03b34a
#define LIBNET_MAXOPTION_SIZE   0x28
Packit 03b34a
Packit 03b34a
/* some BSD variants have this endianess problem */
Packit 03b34a
#if (LIBNET_BSD_BYTE_SWAP)
Packit 03b34a
#define FIX(n)      ntohs(n)
Packit 03b34a
#define UNFIX(n)    htons(n)
Packit 03b34a
#else
Packit 03b34a
#define FIX(n)      (n)
Packit 03b34a
#define UNFIX(n)    (n)
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/* used internally for packet builders */
Packit 03b34a
#define LIBNET_DO_PAYLOAD(l, p)                                              \
Packit 03b34a
if (payload_s && !payload)                                                   \
Packit 03b34a
{                                                                            \
Packit 03b34a
    snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,                                 \
Packit 03b34a
            "%s(): payload inconsistency\n", __func__);                      \
Packit 03b34a
    goto bad;                                                                \
Packit 03b34a
}                                                                            \
Packit 03b34a
if (payload_s)                                                               \
Packit 03b34a
{                                                                            \
Packit 03b34a
    n = libnet_pblock_append(l, p, payload, payload_s);                      \
Packit 03b34a
    if (n == (uint32_t) - 1)                                                 \
Packit 03b34a
    {                                                                        \
Packit 03b34a
        goto bad;                                                            \
Packit 03b34a
    }                                                                        \
Packit 03b34a
}                                                                            \
Packit 03b34a
Packit 03b34a
Packit 03b34a
/* used internally for checksum stuff */
Packit 03b34a
#define LIBNET_CKSUM_CARRY(x) \
Packit 03b34a
    (x = (x >> 16) + (x & 0xffff), (~(x + (x >> 16)) & 0xffff))
Packit 03b34a
Packit 03b34a
/* used interally for OSPF stuff */
Packit 03b34a
#define LIBNET_OSPF_AUTHCPY(x, y) \
Packit 03b34a
    memcpy((uint8_t *)x, (uint8_t *)y, sizeof(y))
Packit 03b34a
#define LIBNET_OSPF_CKSUMBUF(x, y) \
Packit 03b34a
    memcpy((uint8_t *)x, (uint8_t *)y, sizeof(y))  
Packit 03b34a
Packit 03b34a
/* used internally for NTP leap indicator, version, and mode */
Packit 03b34a
#define LIBNET_NTP_DO_LI_VN_MODE(li, vn, md) \
Packit 03b34a
    ((uint8_t)((((li) << 6) & 0xc0) | (((vn) << 3) & 0x38) | ((md) & 0x7)))
Packit 03b34a
Packit 03b34a
/* Not all systems have IFF_LOOPBACK */
Packit 03b34a
#ifdef IFF_LOOPBACK
Packit 03b34a
#define LIBNET_ISLOOPBACK(p) ((p)->ifr_flags & IFF_LOOPBACK)
Packit 03b34a
#else
Packit 03b34a
#define LIBNET_ISLOOPBACK(p) (strcmp((p)->ifr_name, "lo") == 0)
Packit 03b34a
#endif
Packit 03b34a
Packit 03b34a
/* advanced mode check */
Packit 03b34a
#define LIBNET_ISADVMODE(x) (x & 0x08)
Packit 03b34a
Packit 03b34a
/* context queue macros and constants */
Packit 03b34a
#define LIBNET_LABEL_SIZE   64
Packit 03b34a
#define LIBNET_LABEL_DEFAULT "cardshark"
Packit 03b34a
#define CQ_LOCK_UNLOCKED    (u_int)0x00000000
Packit 03b34a
#define CQ_LOCK_READ        (u_int)0x00000001
Packit 03b34a
#define CQ_LOCK_WRITE       (u_int)0x00000002
Packit 03b34a
Packit 03b34a
/**
Packit 03b34a
 * Provides an interface to iterate through the context queue of libnet
Packit 03b34a
 * contexts. Before calling this macro, be sure to set the queue using
Packit 03b34a
 * libnet_cq_head().
Packit 03b34a
 */
Packit 03b34a
#define for_each_context_in_cq(l) \
Packit 03b34a
    for (l = libnet_cq_head(); libnet_cq_last(); l = libnet_cq_next())
Packit 03b34a
Packit 03b34a
/* return 1 if write lock is set on cq */
Packit 03b34a
#define cq_is_wlocked() (l_cqd.cq_lock & CQ_LOCK_WRITE)
Packit 03b34a
Packit 03b34a
/* return 1 if read lock is set on cq */
Packit 03b34a
#define cq_is_rlocked() (l_cqd.cq_lock & CQ_LOCK_READ)
Packit 03b34a
Packit 03b34a
/* return 1 if any lock is set on cq */
Packit 03b34a
#define cq_is_locked() (l_cqd.cq_lock & (CQ_LOCK_READ | CQ_LOCK_WRITE))
Packit 03b34a
Packit 03b34a
/* check if a context queue is locked */
Packit 03b34a
#define check_cq_lock(x) (l_cqd.cq_lock & x)
Packit 03b34a
Packit 03b34a
#endif  /* __LIBNET_MACROS_H */
Packit 03b34a
Packit 03b34a
/* EOF */