plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }