Annotation of embedaddon/libnet/src/libnet_build_arp.c, revision 1.1
1.1 ! misho 1: /*
! 2: * $Id: libnet_build_arp.c,v 1.12 2004/03/01 20:26:12 mike Exp $
! 3: *
! 4: * libnet
! 5: * libnet_build_arp.c - ARP packet assembler
! 6: *
! 7: * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
! 8: * All rights reserved.
! 9: *
! 10: * Redistribution and use in source and binary forms, with or without
! 11: * modification, are permitted provided that the following conditions
! 12: * are met:
! 13: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: *
! 19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 22: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 29: * SUCH DAMAGE.
! 30: *
! 31: */
! 32:
! 33: #if (HAVE_CONFIG_H)
! 34: #include "../include/config.h"
! 35: #endif
! 36: #if (!(_WIN32) || (__CYGWIN__))
! 37: #include "../include/libnet.h"
! 38: #else
! 39: #include "../include/win32/libnet.h"
! 40: #endif
! 41:
! 42:
! 43: libnet_ptag_t
! 44: libnet_build_arp(u_int16_t hrd, u_int16_t pro, u_int8_t hln, u_int8_t pln,
! 45: u_int16_t op, u_int8_t *sha, u_int8_t *spa, u_int8_t *tha, u_int8_t *tpa,
! 46: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
! 47: {
! 48: u_int32_t n, h;
! 49: libnet_pblock_t *p;
! 50: struct libnet_arp_hdr arp_hdr;
! 51:
! 52: if (l == NULL)
! 53: {
! 54: return (-1);
! 55: }
! 56:
! 57: n = LIBNET_ARP_H + (2 * hln) + (2 * pln) + payload_s;
! 58: h = 0; /* ARP headers have no checksum */
! 59:
! 60: /*
! 61: * Find the existing protocol block if a ptag is specified, or create
! 62: * a new one.
! 63: */
! 64: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_ARP_H);
! 65: if (p == NULL)
! 66: {
! 67: return (-1);
! 68: }
! 69:
! 70: memset(&arp_hdr, 0, sizeof(arp_hdr));
! 71: arp_hdr.ar_hrd = htons(hrd); /* hardware address type */
! 72: arp_hdr.ar_pro = htons(pro); /* protocol address type */
! 73: arp_hdr.ar_hln = hln; /* hardware address length */
! 74: arp_hdr.ar_pln = pln; /* protocol address length */
! 75: arp_hdr.ar_op = htons(op); /* opcode command */
! 76:
! 77: n = libnet_pblock_append(l, p, (u_int8_t *)&arp_hdr, LIBNET_ARP_H);
! 78: if (n == -1)
! 79: {
! 80: /* err msg set in libnet_pblock_append() */
! 81: goto bad;
! 82: }
! 83: n = libnet_pblock_append(l, p, sha, hln);
! 84: if (n == -1)
! 85: {
! 86: /* err msg set in libnet_pblock_append() */
! 87: goto bad;
! 88: }
! 89: n = libnet_pblock_append(l, p, spa, pln);
! 90: if (n == -1)
! 91: {
! 92: /* err msg set in libnet_pblock_append() */
! 93: goto bad;
! 94: }
! 95: n = libnet_pblock_append(l, p, tha, hln);
! 96: if (n == -1)
! 97: {
! 98: /* err msg set in libnet_pblock_append() */
! 99: goto bad;
! 100: }
! 101: n = libnet_pblock_append(l, p, tpa, pln);
! 102: if (n == -1)
! 103: {
! 104: /* err msg set in libnet_pblock_append() */
! 105: goto bad;
! 106: }
! 107:
! 108: if ((payload && !payload_s) || (!payload && payload_s))
! 109: {
! 110: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
! 111: "%s(): payload inconsistency\n", __func__);
! 112: goto bad;
! 113: }
! 114:
! 115: if (payload && payload_s)
! 116: {
! 117: n = libnet_pblock_append(l, p, payload, payload_s);
! 118: if (n == -1)
! 119: {
! 120: /* err msg set in libnet_pblock_append() */
! 121: goto bad;
! 122: }
! 123: }
! 124:
! 125: return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_ARP_H));
! 126: bad:
! 127: libnet_pblock_delete(l, p);
! 128: return (-1);
! 129: }
! 130:
! 131: libnet_ptag_t
! 132: libnet_autobuild_arp(u_int16_t op, u_int8_t *sha, u_int8_t *spa, u_int8_t *tha,
! 133: u_int8_t *tpa, libnet_t *l)
! 134: {
! 135: u_short hrd;
! 136:
! 137: switch (l->link_type)
! 138: {
! 139: case 1: /* DLT_EN10MB */
! 140: hrd = ARPHRD_ETHER;
! 141: break;
! 142: case 6: /* DLT_IEEE802 */
! 143: hrd = ARPHRD_IEEE802;
! 144: break;
! 145: default:
! 146: hrd = 0;
! 147: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
! 148: "%s(): unsupported link type\n", __func__);
! 149: return (-1);
! 150: /* add other link-layers */
! 151: }
! 152:
! 153: return (libnet_build_arp(
! 154: hrd, /* hardware addr */
! 155: ETHERTYPE_IP, /* protocol addr */
! 156: 6, /* hardware addr size */
! 157: 4, /* protocol addr size */
! 158: op, /* operation type */
! 159: sha, /* sender hardware addr */
! 160: spa, /* sender protocol addr */
! 161: tha, /* target hardware addr */
! 162: tpa, /* target protocol addr */
! 163: NULL, /* payload */
! 164: 0, /* payload size */
! 165: l, /* libnet context */
! 166: 0)); /* libnet id */
! 167: }
! 168:
! 169: /* EOF */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>