Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 May 1999 13:05:17 +0000 (GMT)
From:      "@cm3_1aM3r" <bugtraq@edoropolis.org>
To:        freebsd-hackers@FreeBSD.ORG
Subject:   arp & bpf..?
Message-ID:  <Pine.BSF.4.05.9905271256060.3693-100000@francine.edoropolis.org>

next in thread | raw e-mail | index | archive | help
Hi,

I've been experimenting around a bit with the bpf interface, but I seem to
do something completely wrong. I tried to recreate an ARP request, but it
doesn't seem to work. Can anyone find the problem in the source
included..? I've tried just about any combination of host-to-network- and
network-to-host byte order..

Thanks,

-- Khamba Staring

Ps: I'm not subscribed to this mailing list, so if you're replying, could
you please be so kind to cc me..?

--------- begin source -----------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/route.h>
#include <net/bpf.h>

#define ETHER_ARPPROTO 0x806
#define ETHERLEN 6
#define IPLEN 4
#define ARP_REQUEST 1
#define ARP_REPLY 2


struct dlinkproto {
  u_char  dest[ETHERLEN];
/* u_char  source[ETHERLEN]; source addy is already added in header */
  u_short type;
};

struct arpproto {
  u_short hardware;
  u_short protocol;
  u_char  hlen;
  u_char  plen;
  u_short opcode;
  u_char  h_sender[ETHERLEN];
  u_char  p_sender[IPLEN];
  u_char  h_recv[ETHERLEN];
  u_char  p_recv[IPLEN];
};

int main(argc, argv)
  int argc;
  char *argv[];
{
  char bpf_dev[10], *packet;
  struct ifreq ifr;
  struct dlinkproto *dlink;
  struct arpproto *arp;
  int n = 0, fd, len;


  len = sizeof(struct dlinkproto) + sizeof(struct arpproto);
  if(!(packet = malloc(len + 50))) {
    perror("malloc");
    exit(-1);
  } 
  bzero(packet, sizeof(packet));
  dlink = (struct dlinkproto *)packet;
  arp = (struct arpproto *)packet + sizeof(struct dlinkproto);
    
  fd = open("/dev/bpf3", O_RDWR);
    
  if(fd < 0) {
    perror("open");
    exit(-1);
  } 

  len = 0;
  if(ioctl(fd, BIOCGBLEN, &len) < 0) {
    perror("ioctl(BIOCGBLEN)");
    exit(-1);
  } 
  
  bzero(&ifr, sizeof(struct ifreq));
  strcpy(ifr.ifr_name, "ed1");
  if(ioctl(fd, BIOCSETIF, &ifr) < 0) {
    perror("ioctl(BIOCSETIF)");
    exit(-1);
  } 
  
  n = 1;
  if(ioctl(fd, BIOCIMMEDIATE, &n) < 0) {
    perror("ioctl(BIOCIMMEDIATE)");
    exit(-1);
  } 
  
/*
** destination mac address.
*/  
  dlink->dest[0] = 0xf9;
  dlink->dest[1] = 0xf8;
  dlink->dest[2] = 0xf7;
  dlink->dest[3] = 0xf6;
  dlink->dest[4] = 0xf5;
  dlink->dest[5] = 0xf4;
  dlink->type = htons(ETHER_ARPPROTO);
  arp->hardware = 1;
  arp->protocol = htons(ETHER_ARPPROTO);
  arp->hlen = ETHERLEN;
  arp->plen = IPLEN;
  arp->opcode = ARP_REQUEST;
  arp->h_sender[0] = 0x2a;
  arp->h_sender[1] = 0x2b;
  arp->h_sender[2] = 0x2c;
  arp->h_sender[3] = 0x2d;
  arp->h_sender[4] = 0x2e;
  arp->h_sender[5] = 0x2f;
    
  write(fd, packet, sizeof(struct dlinkproto) + sizeof(arp));
    
  close(fd);

  free(packet);
    
  return 0;
}   




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9905271256060.3693-100000>