10 uchar prefixvals[256] =
27 static char *efmt = "%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux";
28 static char *ifmt = "%d.%d.%d.%d";
32 int i, j, n, eln, eli;
35 case 'E': /* Ethernet address */
36 p = va_arg(f->args, uchar*);
37 snprint(buf, sizeof buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]);
38 return fmtstrcpy(f, buf);
40 case 'I': /* Ip address */
41 p = va_arg(f->args, uchar*);
43 if(memcmp(p, v4prefix, 12) == 0){
44 snprint(buf, sizeof buf, ifmt, p[12], p[13], p[14], p[15]);
45 return fmtstrcpy(f, buf);
48 /* find longest elision */
50 for(i = 0; i < 16; i += 2){
51 for(j = i; j < 16; j += 2)
52 if(p[j] != 0 || p[j+1] != 0)
54 if(j > i && j - i > eln){
60 /* print with possible elision */
62 for(i = 0; i < 16; i += 2){
64 n += sprint(buf+n, "::");
69 n += sprint(buf+n, ":");
70 s = (p[i]<<8) + p[i+1];
71 n += sprint(buf+n, "%ux", s);
73 return fmtstrcpy(f, buf);
75 case 'i': /* v6 address as 4 longs */
76 lp = va_arg(f->args, ulong*);
77 for(i = 0; i < 4; i++)
78 hnputl(ip+4*i, *lp++);
82 case 'V': /* v4 ip address */
83 p = va_arg(f->args, uchar*);
84 snprint(buf, sizeof buf, ifmt, p[0], p[1], p[2], p[3]);
85 return fmtstrcpy(f, buf);
87 case 'M': /* ip mask */
88 p = va_arg(f->args, uchar*);
90 /* look for a prefix mask */
91 for(i = 0; i < 16; i++)
95 if((prefixvals[p[i]] & Isprefix) == 0)
97 for(j = i+1; j < 16; j++)
100 n = 8*i + (prefixvals[p[i]] & ~Isprefix);
104 /* got one, use /xx format */
105 snprint(buf, sizeof buf, "/%d", n);
106 return fmtstrcpy(f, buf);
108 return fmtstrcpy(f, "(eipfmt)");