tgre.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR 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 }