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