11 #include <sys/ioctl.h> 16 #include <netpacket/packet.h> 17 #include <net/ethernet.h> 18 #include <sys/types.h> 20 #include <netinet/in.h> 21 #include <arpa/inet.h> 22 #include <sys/socket.h> 24 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 26 #define vprintf(...) if (qflag) ; else fprintf(stderr, __VA_ARGS__) 27 #define mintu(x) ((x) > 60 ? x : 60) 141 char *
getpciid(
char *,
int,
char *);
152 char *ethnames[
Neth];
155 memset(ethnames, 0,
sizeof ethnames);
156 printf(
"Probing...");
159 for (i=0; i<n; i++) {
161 e->
name = ethnames[i];
162 e->
up =
ifup(ethnames[i]);
164 fprintf(stderr,
"pthread_create failed.\n");
173 if (argc == 2 && strcmp(argv[1],
"-v") == 0)
182 char *hex =
"0123456789abcdef", *p;
185 for (i=0; i<6; i++) {
186 *p++ = hex[((ea[i] >> 4) & 0xf)];
187 *p++ = hex[ea[i] & 0xf];
201 printf(
"%s:\n", e->
name);
202 for (lun=e->
luns; lun; lun=lun->
next)
214 memset(&sa, 0,
sizeof sa);
215 sa.sa_handler =
catch;
216 sa.sa_flags = SA_RESETHAND;
217 sigaction(SIGALRM, &sa, NULL);
227 memset(e->
pkt, 0,
sizeof e->
pkt);
229 memset(a->
dst, 0xff, 6);
230 memmove(a->
src, e->
ea, 6);
237 if (write(e->
fd, a,
mintu(
sizeof *q)) <= 0)
253 fprintf(stderr,
"skipping %s, discover failure: %s\n", e->
name, strerror(errno));
264 if (poll(&pd, 1,
waitsecs*1000) > 0)
265 if ((n = read(e->
fd, e->
pkt,
sizeof e->
pkt)) > 0)
285 if ((a->
tag[0] & 0x80) == 0)
304 if (lun->
id != tag>>16) {
305 printf(
"lun->id %d != tag %ld for %d.%d\n", lun->
id, tag>>16, lun->
major, lun->
minor);
367 memset(e->
pkt, 0,
sizeof e->
pkt);
370 memcpy(a->
dst, lun->
ea, 6);
371 memcpy(a->
src, e->
ea, 6);
379 n = e->
mtu -
sizeof *aa;
380 for (n &= ~511; n > 0; n -= 512) {
382 if (write(e->
fd, a,
sizeof *aa + n) <= 0) {
383 printf(
"write failed\n");
398 for (; (p=*pp); pp=&p->
next) {
407 n = memcmp(p->
ea, a->
src, 6);
419 memmove(p->
ea, a->
src, 6);
421 p->
id = 0x8000 |
id++;
438 strcpy(xx.ifr_name, name);
439 n = ioctl(
sfd, SIOCGIFINDEX, &xx);
442 return xx.ifr_ifindex;
451 strcpy(xx.ifr_name, e->
name);
452 n = ioctl(e->
fd, SIOCGIFMTU, &xx);
454 perror(
"Can't get mtu");
463 int n,
sfd, rbsz, sbsz;
464 struct sockaddr_ll sa;
469 memset(&sa, 0,
sizeof sa);
470 memset(&xx, 0,
sizeof xx);
471 sfd = socket(PF_PACKET, SOCK_RAW, htons(
ETaoe));
473 perror(
"got bad socket");
476 if (setsockopt(
sfd, SOL_SOCKET, SO_RCVBUFFORCE, &rbsz,
sizeof rbsz) < 0)
477 fprintf(stderr,
"Failed to set socket rcvbuf size\n");
478 if (setsockopt(
sfd, SOL_SOCKET, SO_SNDBUFFORCE, &sbsz,
sizeof sbsz) < 0)
479 fprintf(stderr,
"Failed to set socket sndbuf size\n");
481 sa.sll_family = AF_PACKET;
482 sa.sll_protocol = htons(
ETaoe);
484 n = bind(
sfd, (
struct sockaddr *)&sa,
sizeof sa);
486 perror(
"bind funky");
489 strcpy(xx.ifr_name, e->
name);
490 n = ioctl(
sfd, SIOCGIFHWADDR, &xx);
492 perror(
"Can't get hw addr");
495 memmove(e->
ea, xx.ifr_hwaddr.sa_data, 6);
507 s = socket(AF_INET, SOCK_STREAM, 0);
511 for (i=0; i<nifs; i++) {
512 memset(&ifr, 0,
sizeof ifr);
514 if (ioctl(s, SIOCGIFNAME, &ifr) < 0)
516 if (strncmp(ifr.ifr_name,
"eth", 3))
578 printf(
"==========================================\n");
579 printf(
"INTERFACE SUMMARY\n");
580 printf(
"==========================================\n");
581 printf(
"Name\tStatus\tMTU\tPCI ID\n");
583 printf(
"==========================================\n");
584 printf(
"DEVICE SUMMARY\n");
585 printf(
"==========================================\n");
586 printf(
"Device\tMacs\tPayload\tLocal Interfaces\n");
601 printf(
"%s\t%s\t%d\t%s\n", e->
name, (e->
up ?
"UP" :
"DN"), e->
mtu, (p ? p :
""));
613 int ps, nsect, nea, nloc;
623 memset(
buf, 0,
sizeof buf);
634 else if (mtu != e->
mtu) {
636 mtu = (e->
mtu > mtu ? e->
mtu : mtu);
646 snprintf(
buf + a,(
sizeof buf) - a,
"%s%s", (a ?
",":
""), e->
name);
647 a += strlen(e->
name) + (a ? 1 : 0);
651 for (m = ml; m; ml = m, nea++) {
655 printf(
"e%d.%d\t%4d\t%d\t%s\n", maj, min, nea, nsect*512,
buf);
657 printf(
" Mismatched number of local vs remote interfaces\n");
664 printf(
" The path %s->%s is only capable of %d byte payloads\n", e->
name,
cea(
mac, l->
ea), l->
maxsect*512);
667 if (e->
mtu < nsect*512 + 36)
668 printf(
" %s: MTU (%d) not set optimally for device's capable payload\n",e->
name, e->
mtu);
670 printf(
" %s: MTU different from other interfaces (%d vs. %d)\n", e->
name, e->
mtu, mtu);
680 for (p = *ml, pp=NULL; p; pp = p, p = p->
next)
681 if (memcmp(p->ea, m, 6) == 0)
684 memcpy(nm->
ea, m, 6);
697 memset(&ifr, 0,
sizeof ifr);
698 s = socket(AF_INET, SOCK_STREAM, 0);
701 strcpy(ifr.ifr_name, ethname);
702 if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
706 r = ifr.ifr_flags & IFF_UP;
717 memset(a, 0,
sizeof a);
718 memset(b, 0,
sizeof b);
719 for (i=0; i < nifs; i++) {
724 j = strcmp(n, ifs[i]);
727 for (; ifs[i]; i++) {
750 memset(dev, 0,
sizeof dev);
751 memset(ven, 0,
sizeof ven);
752 memset(path, 0,
sizeof path);
753 sprintf(path,
"/sys/class/net/%s/device/vendor", n);
754 if ((fd = fopen(path,
"r")) == NULL)
756 fseek(fd, 2, SEEK_SET);
757 if (fread(ven, 1, 4, fd) <= 0) {
762 sprintf(path,
"/sys/class/net/%s/device/device", n);
763 if ((fd = fopen(path,
"r")) == NULL)
765 fseek(fd, 2, SEEK_SET);
766 if (fread(dev, 1, 4, fd) <= 0) {
771 snprintf(b, blen,
"%s:%s", ven, dev);