gre.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 }