[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]
Communications Programming Concepts
Sending Packets Over Ethernet Example Program
#include <stdio.h>
#include <sys/ndd_var.h>
#include <sys/kinfo.h>
/*
* Get the MAC address of the ethernet adapter we're using...
*/
getaddr(char *device, char *addr)
{
int size;
struct kinfo_ndd *nddp;
void *end;
int found = 0;
size = getkerninfo(KINFO_NDD, 0, 0, 0);
if (size == 0) {
fprintf(stderr, "No ndds.\n");
exit(0);
}
if (size < 0) {
perror("getkerninfo 1");
exit(1);
}
nddp = (struct kinfo_ndd *)malloc(size);
if (!nddp) {
perror("malloc");
exit(1);
}
if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) {
perror("getkerninfo 2");
exit(2);
}
end = (void *)nddp + size;
while (((void *)nddp < end) && !found) {
if (!strcmp(nddp->ndd_alias, device) ||
!strcmp(nddp->ndd_name, device)) {
found++;
bcopy(nddp->ndd_addr, addr, 6);
} else
nddp++;
}
return (found);
}
/*
* Hex print function...
*/
pit(str, buf, len)
u_char *str;
u_char *buf;
int len;
{
int i;
printf("%s", str);
for (i=0; i<len; i++)
printf("%2.2X", buf[i]);
printf("\n");
fflush(stdout);
}
/*
* Ethernet packet format...
*/
typedef struct {
unsigned char dst[6];
unsigned char src[6];
unsigned short ethertype;
unsigned char data[1500];
} xmit;
/*
* Convert ascii hardware address into byte string.
*/
hwaddr_aton(a, n)
char *a;
u_char *n;
{
int i, o[6];
i = sscanf(a, "%x:%x:%x:%x:%x:%x", &o[0], &o[1], &o[2],
&o[3], &o[4], &o[5]);
if (i != 6) {
fprintf(stderr, "invalid hardware address '%s'\n");
return (0);
}
for (i=0; i<6; i++)
n[i] = o[i];
return (6);
}
main(int argc, char *argv[]) {
char srcaddr[6];
char *device, dstaddr[6];
u_int ethertype;
u_int count, size;
xmit buf;
int s;
struct sockaddr_ndd_8022 sa;
int last;
if (argc != 6) {
printf("Usage: %s <ifname> dstaddr ethertype count size\n", argv[0]);
printf("EG: %s en0 01:02:03:04:05:06 0x600 10 10\n",
argv[0]);
exit(1);
}
if (!getaddr(argv[1], srcaddr)) {
printf("interface not found\n");
exit(1);
}
device=argv[1];
hwaddr_aton(argv[2], dstaddr);
pit("src addr = ", srcaddr, 6);
pit("dst addr = ", dstaddr, 6);
sscanf(argv[3], "%x", ðertype);
count = atoi(argv[4]);
size = atoi(argv[5]);
if (size > 1500)
size = 1500;
if (size < 60)
size = 60;
printf("Ethertype: %x\n", ethertype);
printf("Count: %d\n", count);
printf("Size: %d\n", size);
s = socket(AF_NDD, SOCK_DGRAM, NDD_PROT_ETHER);
if (s < 0) {
perror("socket");
exit(1);
}
sa.sndd_8022_family = AF_NDD;
sa.sndd_8022_len = sizeof(sa);
sa.sndd_8022_filtertype = NS_ETHERTYPE;
sa.sndd_8022_ethertype = (u_short)ethertype;
sa.sndd_8022_filterlen = sizeof(struct ns_8022);
bcopy(device, sa.sndd_8022_nddname, sizeof(sa.sndd_8022_nddname));
if (bind(s, (struct sockaddr *)&sa, sizeof(sa))) {
perror("bind");
exit(2);
}
bcopy(dstaddr, buf.dst, sizeof(buf.dst));
bcopy(srcaddr, buf.src, sizeof(buf.src));
buf.ethertype = (u_short)ethertype;
if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
perror("connect");
exit(3);
}
last = count;
while (count-- > 0) {
sprintf(buf.data, "Foo%d", last-count);
if (write(s, &buf, size) < 0) {
perror("write");
exit(4);
}
}
close(s);
}
[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]