#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; main(int argc, char *argv[]) { char *device; u_int ethertype; xmit buf; int s; struct sockaddr_ndd_8022 sa; int cc; if (argc != 3) { printf("Usage: %s <ifname> ethertype\n", argv[0]); printf("EG: %s ent0 0x600\n", argv[0]); exit(1); } device = argv[1]; sscanf(argv[2], "%x", ðertype); printf("Ethertype: %x\n", ethertype); 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); } if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { perror("connect"); exit(3); } do { if ((cc = read(s, &buf, sizeof(buf))) < 0) { perror("write"); exit(4); } if (cc) { printf("Read %d bytes:\n", cc); pit("\tsrc = ", buf.src, 6); pit("\tdst = ", buf.dst, 6); pit("\ttype = ", &(buf.ethertype), 2); printf("\tdata string: %s\n", buf.data); } } while (cc > 0); close(s); }