Blame


1 d7094239 2003-11-23 devnull #include <u.h>
2 d7094239 2003-11-23 devnull #include <libc.h>
3 d7094239 2003-11-23 devnull #include <ip.h>
4 d7094239 2003-11-23 devnull
5 d7094239 2003-11-23 devnull enum
6 d7094239 2003-11-23 devnull {
7 cbeb0b26 2006-04-01 devnull Isprefix= 16
8 d7094239 2003-11-23 devnull };
9 d7094239 2003-11-23 devnull
10 cbeb0b26 2006-04-01 devnull /* XXX: manually initialize once to placate the Sun monster */
11 5241ed2b 2004-07-03 devnull uchar prefixvals[256];
12 5241ed2b 2004-07-03 devnull #ifdef NOTDEF
13 d7094239 2003-11-23 devnull uchar prefixvals[256] =
14 d7094239 2003-11-23 devnull {
15 d7094239 2003-11-23 devnull [0x00] 0 | Isprefix,
16 d7094239 2003-11-23 devnull [0x80] 1 | Isprefix,
17 d7094239 2003-11-23 devnull [0xC0] 2 | Isprefix,
18 d7094239 2003-11-23 devnull [0xE0] 3 | Isprefix,
19 d7094239 2003-11-23 devnull [0xF0] 4 | Isprefix,
20 d7094239 2003-11-23 devnull [0xF8] 5 | Isprefix,
21 d7094239 2003-11-23 devnull [0xFC] 6 | Isprefix,
22 d7094239 2003-11-23 devnull [0xFE] 7 | Isprefix,
23 d7094239 2003-11-23 devnull [0xFF] 8 | Isprefix,
24 d7094239 2003-11-23 devnull };
25 5241ed2b 2004-07-03 devnull #endif
26 d7094239 2003-11-23 devnull
27 d7094239 2003-11-23 devnull int
28 d7094239 2003-11-23 devnull eipfmt(Fmt *f)
29 d7094239 2003-11-23 devnull {
30 d7094239 2003-11-23 devnull char buf[5*8];
31 821fff98 2005-12-26 devnull static char *efmt = "%.2ux%.2ux%.2ux%.2ux%.2ux%.2ux";
32 821fff98 2005-12-26 devnull static char *altefmt = "%.2ux:%.2ux:%.2ux:%.2ux:%.2ux:%.2ux";
33 d7094239 2003-11-23 devnull static char *ifmt = "%d.%d.%d.%d";
34 821fff98 2005-12-26 devnull char *fmt;
35 d7094239 2003-11-23 devnull uchar *p, ip[16];
36 d7094239 2003-11-23 devnull ulong *lp;
37 d7094239 2003-11-23 devnull ushort s;
38 d7094239 2003-11-23 devnull int i, j, n, eln, eli;
39 d7094239 2003-11-23 devnull
40 cbeb0b26 2006-04-01 devnull static int once = 0; /* XXX: placate the Sun monster */
41 5241ed2b 2004-07-03 devnull
42 5241ed2b 2004-07-03 devnull if(!once){
43 5241ed2b 2004-07-03 devnull once = 1;
44 5241ed2b 2004-07-03 devnull memset(prefixvals, 0, sizeof(prefixvals));
45 5241ed2b 2004-07-03 devnull prefixvals[0x00] = 0 | Isprefix;
46 5241ed2b 2004-07-03 devnull prefixvals[0x80] = 1 | Isprefix;
47 5241ed2b 2004-07-03 devnull prefixvals[0xC0] = 2 | Isprefix;
48 5241ed2b 2004-07-03 devnull prefixvals[0xE0] = 3 | Isprefix;
49 5241ed2b 2004-07-03 devnull prefixvals[0xF0] = 4 | Isprefix;
50 5241ed2b 2004-07-03 devnull prefixvals[0xF8] = 5 | Isprefix;
51 5241ed2b 2004-07-03 devnull prefixvals[0xFC] = 6 | Isprefix;
52 5241ed2b 2004-07-03 devnull prefixvals[0xFE] = 7 | Isprefix;
53 5241ed2b 2004-07-03 devnull prefixvals[0xFF] = 8 | Isprefix;
54 5241ed2b 2004-07-03 devnull }
55 5241ed2b 2004-07-03 devnull
56 d7094239 2003-11-23 devnull switch(f->r) {
57 d7094239 2003-11-23 devnull case 'E': /* Ethernet address */
58 d7094239 2003-11-23 devnull p = va_arg(f->args, uchar*);
59 821fff98 2005-12-26 devnull fmt = efmt;
60 821fff98 2005-12-26 devnull if(f->flags&FmtSharp)
61 821fff98 2005-12-26 devnull fmt = altefmt;
62 1237836a 2005-12-31 devnull snprint(buf, sizeof buf, fmt, p[0], p[1], p[2], p[3], p[4], p[5]);
63 d7094239 2003-11-23 devnull return fmtstrcpy(f, buf);
64 d7094239 2003-11-23 devnull
65 d7094239 2003-11-23 devnull case 'I': /* Ip address */
66 d7094239 2003-11-23 devnull p = va_arg(f->args, uchar*);
67 d7094239 2003-11-23 devnull common:
68 d7094239 2003-11-23 devnull if(memcmp(p, v4prefix, 12) == 0){
69 d7094239 2003-11-23 devnull snprint(buf, sizeof buf, ifmt, p[12], p[13], p[14], p[15]);
70 d7094239 2003-11-23 devnull return fmtstrcpy(f, buf);
71 d7094239 2003-11-23 devnull }
72 d7094239 2003-11-23 devnull
73 d7094239 2003-11-23 devnull /* find longest elision */
74 d7094239 2003-11-23 devnull eln = eli = -1;
75 d7094239 2003-11-23 devnull for(i = 0; i < 16; i += 2){
76 d7094239 2003-11-23 devnull for(j = i; j < 16; j += 2)
77 d7094239 2003-11-23 devnull if(p[j] != 0 || p[j+1] != 0)
78 d7094239 2003-11-23 devnull break;
79 d7094239 2003-11-23 devnull if(j > i && j - i > eln){
80 d7094239 2003-11-23 devnull eli = i;
81 d7094239 2003-11-23 devnull eln = j - i;
82 d7094239 2003-11-23 devnull }
83 d7094239 2003-11-23 devnull }
84 d7094239 2003-11-23 devnull
85 d7094239 2003-11-23 devnull /* print with possible elision */
86 d7094239 2003-11-23 devnull n = 0;
87 d7094239 2003-11-23 devnull for(i = 0; i < 16; i += 2){
88 d7094239 2003-11-23 devnull if(i == eli){
89 d7094239 2003-11-23 devnull n += sprint(buf+n, "::");
90 d7094239 2003-11-23 devnull i += eln;
91 d7094239 2003-11-23 devnull if(i >= 16)
92 d7094239 2003-11-23 devnull break;
93 d7094239 2003-11-23 devnull } else if(i != 0)
94 d7094239 2003-11-23 devnull n += sprint(buf+n, ":");
95 d7094239 2003-11-23 devnull s = (p[i]<<8) + p[i+1];
96 d7094239 2003-11-23 devnull n += sprint(buf+n, "%ux", s);
97 d7094239 2003-11-23 devnull }
98 d7094239 2003-11-23 devnull return fmtstrcpy(f, buf);
99 d7094239 2003-11-23 devnull
100 d7094239 2003-11-23 devnull case 'i': /* v6 address as 4 longs */
101 d7094239 2003-11-23 devnull lp = va_arg(f->args, ulong*);
102 d7094239 2003-11-23 devnull for(i = 0; i < 4; i++)
103 d7094239 2003-11-23 devnull hnputl(ip+4*i, *lp++);
104 d7094239 2003-11-23 devnull p = ip;
105 d7094239 2003-11-23 devnull goto common;
106 d7094239 2003-11-23 devnull
107 d7094239 2003-11-23 devnull case 'V': /* v4 ip address */
108 d7094239 2003-11-23 devnull p = va_arg(f->args, uchar*);
109 d7094239 2003-11-23 devnull snprint(buf, sizeof buf, ifmt, p[0], p[1], p[2], p[3]);
110 d7094239 2003-11-23 devnull return fmtstrcpy(f, buf);
111 d7094239 2003-11-23 devnull
112 d7094239 2003-11-23 devnull case 'M': /* ip mask */
113 d7094239 2003-11-23 devnull p = va_arg(f->args, uchar*);
114 d7094239 2003-11-23 devnull
115 d7094239 2003-11-23 devnull /* look for a prefix mask */
116 d7094239 2003-11-23 devnull for(i = 0; i < 16; i++)
117 d7094239 2003-11-23 devnull if(p[i] != 0xff)
118 d7094239 2003-11-23 devnull break;
119 d7094239 2003-11-23 devnull if(i < 16){
120 d7094239 2003-11-23 devnull if((prefixvals[p[i]] & Isprefix) == 0)
121 d7094239 2003-11-23 devnull goto common;
122 d7094239 2003-11-23 devnull for(j = i+1; j < 16; j++)
123 d7094239 2003-11-23 devnull if(p[j] != 0)
124 d7094239 2003-11-23 devnull goto common;
125 d7094239 2003-11-23 devnull n = 8*i + (prefixvals[p[i]] & ~Isprefix);
126 d7094239 2003-11-23 devnull } else
127 d7094239 2003-11-23 devnull n = 8*16;
128 d7094239 2003-11-23 devnull
129 d7094239 2003-11-23 devnull /* got one, use /xx format */
130 d7094239 2003-11-23 devnull snprint(buf, sizeof buf, "/%d", n);
131 d7094239 2003-11-23 devnull return fmtstrcpy(f, buf);
132 d7094239 2003-11-23 devnull }
133 d7094239 2003-11-23 devnull return fmtstrcpy(f, "(eipfmt)");
134 d7094239 2003-11-23 devnull }