/* * $Id: nemesis-proto_arp.c,v 1.1.1.1 2003/10/31 21:29:37 jnathan Exp $ * * THE NEMESIS PROJECT * Copyright (C) 2001 - 2003 Jeff Nathan * Copyright (C) 1999, 2000, 2001 Mark Grimes * * nemesis-proto_arp.c (ARP Packet Generator) * */ #include "nemesis-arp.h" #include "nemesis.h" int buildarp(ETHERhdr *eth, ARPhdr *arp, FileData *pd, char *device, int reply) { int n = 0; u_int32_t arp_packetlen; static u_int8_t *pkt; struct libnet_link_int *l2 = NULL; /* validation tests */ if (pd->file_mem == NULL) pd->file_s = 0; arp_packetlen = LIBNET_ARP_H + LIBNET_ETH_H + pd->file_s; #ifdef DEBUG printf("DEBUG: ARP packet length %u.\n", arp_packetlen); printf("DEBUG: ARP payload size %u.\n", pd->file_s); #endif if ((l2 = libnet_open_link_interface(device, errbuf)) == NULL) { nemesis_device_failure(INJECTION_LINK, (const char *)device); return -1; } if (libnet_init_packet(arp_packetlen, &pkt) == -1) { fprintf(stderr, "ERROR: Unable to allocate packet memory.\n"); return -1; } libnet_build_ethernet(eth->ether_dhost, eth->ether_shost, eth->ether_type, NULL, 0, pkt); libnet_build_arp(arp->ar_hrd, arp->ar_pro, arp->ar_hln, arp->ar_pln, arp->ar_op, arp->ar_sha, arp->ar_spa, arp->ar_tha, arp->ar_tpa, pd->file_mem, pd->file_s, pkt + LIBNET_ETH_H); n = libnet_write_link_layer(l2, device, pkt, LIBNET_ETH_H + LIBNET_ARP_H + pd->file_s); if (verbose == 2) nemesis_hexdump(pkt, arp_packetlen, HEX_ASCII_DECODE); if (verbose == 3) nemesis_hexdump(pkt, arp_packetlen, HEX_RAW_DECODE); if (n != arp_packetlen) { fprintf(stderr, "ERROR: Incomplete packet injection. Only " "wrote %d bytes.\n", n); } else { if (verbose) { if (memcmp(eth->ether_dhost, (void *)&one, 6)) { printf("Wrote %d byte unicast ARP request packet through " "linktype %s.\n", n, nemesis_lookup_linktype(l2->linktype)); } else { printf("Wrote %d byte %s packet through linktype %s.\n", n, (eth->ether_type == ETHERTYPE_ARP ? "ARP" : "RARP"), nemesis_lookup_linktype(l2->linktype)); } } } libnet_destroy_packet(&pkt); if (l2 != NULL) libnet_close_link_interface(l2); return (n); }