9 uchar prefixvals[256] =
22 uchar v4prefix[16] = {
30 hnputl(void *p, ulong v)
42 eipconv(va_list *arg, Fconv *f)
45 static char *efmt = "%.2lux%.2lux%.2lux%.2lux%.2lux%.2lux";
46 static char *ifmt = "%d.%d.%d.%d";
50 int i, j, n, eln, eli;
53 case 'E': /* Ethernet address */
54 p = va_arg(*arg, uchar*);
55 sprint(buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]);
57 case 'I': /* Ip address */
58 p = va_arg(*arg, uchar*);
60 if(memcmp(p, v4prefix, 12) == 0)
61 sprint(buf, ifmt, p[12], p[13], p[14], p[15]);
63 /* find longest elision */
65 for(i = 0; i < 16; i += 2){
66 for(j = i; j < 16; j += 2)
67 if(p[j] != 0 || p[j+1] != 0)
69 if(j > i && j - i > eln){
75 /* print with possible elision */
77 for(i = 0; i < 16; i += 2){
79 n += sprint(buf+n, "::");
84 n += sprint(buf+n, ":");
85 s = (p[i]<<8) + p[i+1];
86 n += sprint(buf+n, "%ux", s);
90 case 'i': /* v6 address as 4 longs */
91 lp = va_arg(*arg, ulong*);
92 for(i = 0; i < 4; i++)
93 hnputl(ip+4*i, *lp++);
96 case 'V': /* v4 ip address */
97 p = va_arg(*arg, uchar*);
98 sprint(buf, ifmt, p[0], p[1], p[2], p[3]);
100 case 'M': /* ip mask */
101 p = va_arg(*arg, uchar*);
103 /* look for a prefix mask */
104 for(i = 0; i < 16; i++)
108 if((prefixvals[p[i]] & Isprefix) == 0)
110 for(j = i+1; j < 16; j++)
113 n = 8*i + (prefixvals[p[i]] & ~Isprefix);
117 /* got one, use /xx format */
118 sprint(buf, "/%d", n);
121 strcpy(buf, "(eipconv)");
124 return sizeof(uchar*);
127 uchar testvec[11][16] =
129 { 0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 1,3,4,5, },
130 { 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, },
131 { 0xff,0xff,0x80,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, },
132 { 0xff,0xff,0xff,0xc0, 0,0,0,0, 0,0,0,0, 0,0,0,0, },
133 { 0xff,0xff,0xff,0xff, 0xe0,0,0,0, 0,0,0,0, 0,0,0,0, },
134 { 0xff,0xff,0xff,0xff, 0xff,0xf0,0,0, 0,0,0,0, 0,0,0,0, },
135 { 0xff,0xff,0xff,0xff, 0xff,0xff,0xf8,0, 0,0,0,0, 0,0,0,0, },
136 { 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, },
137 { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, },
138 { 0,0,0,0, 0,0x11,0,0, 0,0,0,0, 0,0,0,0, },
139 { 0,0,0,0x11, 0,0,0,0, 0,0,0,0, 0,0,0,0x12, },
147 fmtinstall('I', eipconv);
148 fmtinstall('M', eipconv);
149 for(i = 0; i < 11; i++)
150 print("%I\n%M\n", testvec[i], testvec[i]);