xref: /plan9-contrib/sys/src/cmd/ip/linklocal.c (revision fececb924262ae5acb31c5c448a4a6a523887b15)
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