linklocal.c 867 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * linklocal - print ipv6 linklocal address of a mac address
  3. */
  4. #include <u.h>
  5. #include <libc.h>
  6. #include <ip.h>
  7. void
  8. ea2lla(uchar *lla, uchar *ea)
  9. {
  10. assert(IPaddrlen == 16);
  11. memset(lla, 0, IPaddrlen);
  12. lla[0] = 0xFE;
  13. lla[1] = 0x80;
  14. lla[8] = ea[0] | 0x2;
  15. lla[9] = ea[1];
  16. lla[10] = ea[2];
  17. lla[11] = 0xFF;
  18. lla[12] = 0xFE;
  19. lla[13] = ea[3];
  20. lla[14] = ea[4];
  21. lla[15] = ea[5];
  22. }
  23. static void
  24. process(char *ether)
  25. {
  26. uchar ethaddr[6], ipaddr[16];
  27. if (parseether(ethaddr, ether) < 0)
  28. sysfatal("%s: not an ether address\n", ether);
  29. ea2lla(ipaddr, ethaddr);
  30. print("%I\n", ipaddr);
  31. }
  32. void
  33. main(int argc, char *argv[])
  34. {
  35. int i, errflg = 0;
  36. ARGBEGIN {
  37. default:
  38. errflg++;
  39. break;
  40. } ARGEND
  41. fmtinstall('I', eipfmt);
  42. if (argc <= 0 || errflg)
  43. sysfatal("usage: %s ether...", argv0);
  44. for (i = 0; i < argc; i++)
  45. process(argv[i]);
  46. exits(0);
  47. }