URI:
       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 }