Blame


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