Blame __dist_sample/sample/test_ipv6_icmpv4.c

Packit Service b25606
/*
Packit Service b25606
 * Regression test for bugs such as reported in:
Packit Service b25606
 *   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=418975
Packit Service b25606
 *
Packit Service b25606
 * Copyright (c) 2009 Sam Roberts <sroberts@wurldtech.com>
Packit Service b25606
 * All rights reserved.
Packit Service b25606
 *
Packit Service b25606
 * Redistribution and use in source and binary forms, with or without
Packit Service b25606
 * modification, are permitted provided that the following conditions
Packit Service b25606
 * are met:
Packit Service b25606
 * 1. Redistributions of source code must retain the above copyright
Packit Service b25606
 *    notice, this list of conditions and the following disclaimer.
Packit Service b25606
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service b25606
 *    notice, this list of conditions and the following disclaimer in the
Packit Service b25606
 *    documentation and/or other materials provided with the distribution.
Packit Service b25606
 *
Packit Service b25606
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service b25606
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service b25606
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service b25606
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service b25606
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service b25606
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service b25606
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service b25606
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service b25606
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service b25606
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service b25606
 * SUCH DAMAGE.
Packit Service b25606
 *
Packit Service b25606
 */
Packit Service b25606
#if (HAVE_CONFIG_H)
Packit Service b25606
#include "../include/config.h"
Packit Service b25606
#endif
Packit Service b25606
#include "./libnet_test.h"
Packit Service b25606
Packit Service b25606
#include <assert.h>
Packit Service b25606
Packit Service b25606
#include <netinet/in.h>
Packit Service b25606
Packit Service b25606
static void print_pblocks(libnet_t* l)
Packit Service b25606
{
Packit Service b25606
    libnet_pblock_t* p = l->protocol_blocks;
Packit Service b25606
Packit Service b25606
    while(p) {
Packit Service b25606
        /* h_len is header length for checksumming? "chksum length"? */
Packit Service b25606
        printf("  tag %d flags %d type %20s/%#x buf %p b_len %2u h_len %2u copied %2u\n",
Packit Service b25606
                p->ptag, p->flags,
Packit Service b25606
                libnet_diag_dump_pblock_type(p->type), p->type,
Packit Service b25606
                p->buf, p->b_len, p->h_len, p->copied);
Packit Service b25606
        p = p->next;
Packit Service b25606
    }
Packit Service b25606
    printf("  link_offset %d aligner %d total_size %u nblocks %d\n",
Packit Service b25606
            l->link_offset, l->aligner, l->total_size, l->n_pblocks);
Packit Service b25606
Packit Service b25606
}
Packit Service b25606
Packit Service b25606
int
Packit Service b25606
main(int argc, char *argv[])
Packit Service b25606
{
Packit Service b25606
    libnet_t *l;
Packit Service b25606
    int r;
Packit Service b25606
    char *device = "eth0";
Packit Service b25606
    struct libnet_ether_addr *mac_address;
Packit Service b25606
    struct in6_addr src_ip;
Packit Service b25606
    struct libnet_in6_addr dst_ip;
Packit Service b25606
    char errbuf[LIBNET_ERRBUF_SIZE];
Packit Service b25606
    libnet_ptag_t icmp_ptag = 0;
Packit Service b25606
    libnet_ptag_t ipv6_ptag = 0;
Packit Service b25606
    char payload[24] = { 0 };
Packit Service b25606
Packit Service b25606
    memset(&src_ip, 0x66, sizeof(src_ip));
Packit Service b25606
Packit Service b25606
    l = libnet_init( LIBNET_RAW6, device, errbuf);
Packit Service b25606
Packit Service b25606
    assert(l);
Packit Service b25606
Packit Service b25606
    mac_address = libnet_get_hwaddr(l);
Packit Service b25606
    assert(mac_address);
Packit Service b25606
Packit Service b25606
    dst_ip = libnet_name2addr6(l, "::1" /* BCAST_ADDR - defined where? */, LIBNET_DONT_RESOLVE);
Packit Service b25606
Packit Service b25606
    memcpy(payload,src_ip.s6_addr,16);
Packit Service b25606
    payload[16] = 2; /* 2 for Target Link-layer Address */
Packit Service b25606
    payload[17] = 1; /* The length of the option */
Packit Service b25606
    memcpy(payload+18,mac_address->ether_addr_octet, 6);
Packit Service b25606
Packit Service b25606
    /* 0x2000: RSO */
Packit Service b25606
    icmp_ptag = libnet_build_icmpv4_echo(
Packit Service b25606
            136,0,0,0x2000,0,
Packit Service b25606
            (uint8_t *)payload,sizeof(payload), l, LIBNET_PTAG_INITIALIZER);
Packit Service b25606
    assert(icmp_ptag);
Packit Service b25606
Packit Service b25606
    ipv6_ptag = libnet_build_ipv6(
Packit Service b25606
            0, 0,
Packit Service b25606
            LIBNET_ICMPV6_H + sizeof(payload), /* ICMPV6_H == ICMPV4_H, luckily */
Packit Service b25606
            IPPROTO_ICMP6,
Packit Service b25606
            255,
Packit Service b25606
            *(struct libnet_in6_addr*)&src_ip,
Packit Service b25606
            dst_ip,
Packit Service b25606
            NULL, 0,
Packit Service b25606
            l, 0);
Packit Service b25606
    assert(icmp_ptag);
Packit Service b25606
Packit Service b25606
    print_pblocks(l);
Packit Service b25606
Packit Service b25606
    {
Packit Service b25606
       uint8_t* pkt1 = NULL;
Packit Service b25606
       uint32_t pkt1_sz = 0;
Packit Service b25606
       r = libnet_pblock_coalesce(l, &pkt1, &pkt1_sz);
Packit Service b25606
       assert(r >= 0);
Packit Service b25606
Packit Service b25606
       libnet_diag_dump_hex(pkt1, LIBNET_IPV6_H, 0, stdout);
Packit Service b25606
       libnet_diag_dump_hex(pkt1+LIBNET_IPV6_H, pkt1_sz-LIBNET_IPV6_H, 0, stdout);
Packit Service b25606
Packit Service b25606
       free(pkt1);
Packit Service b25606
       pkt1 = NULL;
Packit Service b25606
    }
Packit Service b25606
Packit Service b25606
    r = libnet_write(l);
Packit Service b25606
    assert(r >= 0);
Packit Service b25606
Packit Service b25606
    return (EXIT_SUCCESS);
Packit Service b25606
}
Packit Service b25606