tgre.c - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tgre.c (1498B) | |
--- | |
1 | |
2 /* GRE flag bits */ | |
3 enum { | |
4 GRE_chksum = (1<<15), | |
5 GRE_routing = (1<<14), | |
6 GRE_key = (1<<13), | |
7 GRE_seq = (1<<12), | |
8 GRE_srcrt = (1<<11), | |
9 GRE_recur = (7<<8), | |
10 GRE_ack = (1<<7), | |
11 GRE_ver = 0x7 | |
12 }; | |
13 | |
14 /* GRE protocols */ | |
15 enum { | |
16 GRE_sna = 0x0004, | |
17 GRE_osi = 0x00fe, | |
18 GRE_pup = 0x0200, | |
19 GRE_xns = 0x0600, | |
20 GRE_ip = 0x0800, | |
21 GRE_chaos = 0x0804, | |
22 GRE_rfc826 = 0x0806, | |
23 GRE_frarp = 0x0808, | |
24 GRE_vines = 0x0bad, | |
25 GRE_vinesecho = 0x0bae, | |
26 GRE_vinesloop = 0x0baf, | |
27 GRE_decnetIV = 0x6003, | |
28 GRE_ppp = 0x880b | |
29 }; | |
30 | |
31 int | |
32 sprintgre(void *a, char *buf, int len) | |
33 { | |
34 int flag, prot, chksum, offset, key, seq, ack; | |
35 int n; | |
36 uchar *p = a; | |
37 | |
38 chksum = offset = key = seq = ack = 0; | |
39 | |
40 flag = NetS(p); | |
41 prot = NetS(p+2); | |
42 p += 4; len -= 4; | |
43 if(flag & (GRE_chksum|GRE_routing)){ | |
44 chksum = NetS(p); | |
45 offset = NetS(p+2); | |
46 p += 4; len -= 4; | |
47 } | |
48 if(flag&GRE_key){ | |
49 key = NetL(p); | |
50 p += 4; len -= 4; | |
51 } | |
52 if(flag&GRE_seq){ | |
53 seq = NetL(p); | |
54 p += 4; len -= 4; | |
55 } | |
56 if(flag&GRE_ack){ | |
57 ack = NetL(p); | |
58 p += 4; len -= 4; | |
59 } | |
60 /* skip routing if present */ | |
61 if(flag&GRE_routing) { | |
62 while(len >= 4 && (n=p[3]) != 0) { | |
63 len -= n; | |
64 p += n; | |
65 } | |
66 } | |
67 | |
68 USED(offset); | |
69 USED(chksum); | |
70 | |
71 n = sprint(buf, "GRE(f %4.4ux p %ux k %ux", flag, prot, key); | |
72 if(flag&GRE_seq) | |
73 n += sprint(buf+n, " s %ux", seq); | |
74 if(flag&GRE_ack) | |
75 n += sprint(buf+n, " a %ux", ack); | |
76 n += sprint(buf+n, " len = %d/%d) ", len, key>>16); | |
77 if(prot == GRE_ppp && len > 0) | |
78 n += sprintppp(p, buf+n, len); | |
79 else | |
80 n += sprintx(p, buf+n, len); | |
81 | |
82 return n; | |
83 } |