URI:
       til.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
       ---
       til.c (2253B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <ip.h>
            4 #include "dat.h"
            5 #include "protos.h"
            6 
            7 typedef struct Hdr        Hdr;
            8 struct Hdr
            9 {
           10         uchar        sum[2];                /* Checksum including header */
           11         uchar        len[2];                /* Packet length */
           12         uchar        type;                /* Packet type */
           13         uchar        spec;                /* Special */
           14         uchar        sport[2];        /* Src port */
           15         uchar        dport[2];        /* Dst port */
           16         uchar        id[4];                /* Sequence id */
           17         uchar        ack[4];                /* Acked sequence */
           18 };
           19 
           20 enum
           21 {
           22         ILLEN= 18
           23 };
           24 
           25 enum
           26 {
           27         Os,
           28         Od,
           29         Osd
           30 };
           31 
           32 static Field p_fields[] =
           33 {
           34         {"s",                Fnum,        Os,        "source port",        } ,
           35         {"d",                Fnum,        Od,        "dest port",        } ,
           36         {"a",                Fnum,        Osd,        "source/dest port",        } ,
           37         {"sd",                Fnum,        Osd,        "source/dest port",        } ,
           38         {0}
           39 };
           40 
           41 static Mux p_mux[] =
           42 {
           43         {"ninep",        17007, },        /* exportfs */
           44         {"ninep",        17008, },        /* 9fs */
           45         {"ninep",        17005, },        /* ocpu */
           46         {"ninep",        17010, },        /* ncpu */
           47         {"ninep",        17013, },        /* cpu */
           48         {0}
           49 };
           50 
           51 static void
           52 p_compile(Filter *f)
           53 {
           54         Mux *m;
           55 
           56         if(f->op == '='){
           57                 compile_cmp(udp.name, f, p_fields);
           58                 return;
           59         }
           60         for(m = p_mux; m->name != nil; m++)
           61                 if(strcmp(f->s, m->name) == 0){
           62                         f->pr = m->pr;
           63                         f->ulv = m->val;
           64                         f->subop = Osd;
           65                         return;
           66                 }
           67         sysfatal("unknown il field or protocol: %s", f->s);
           68 }
           69 
           70 static int
           71 p_filter(Filter *f, Msg *m)
           72 {
           73         Hdr *h;
           74 
           75         if(m->pe - m->ps < ILLEN)
           76                 return 0;
           77         h = (Hdr*)m->ps;
           78         m->ps += ILLEN;
           79 
           80         switch(f->subop){
           81         case Os:
           82                 return NetS(h->sport) == f->ulv;
           83         case Od:
           84                 return NetS(h->dport) == f->ulv;
           85         case Osd:
           86                 return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv;
           87         }
           88         return 0;
           89 }
           90 
           91 char *pktnames[] =
           92 {
           93         "Sync",
           94         "Data",
           95         "Dataquery",
           96         "Ack",
           97         "Query",
           98         "State",
           99         "Close"
          100 };
          101 
          102 static char*
          103 pkttype(int t)
          104 {
          105         static char b[10];
          106 
          107         if(t > 6){
          108                 sprint(b, "%d", t);
          109                 return b;
          110         }
          111         return pktnames[t];
          112 }
          113 
          114 static int
          115 p_seprint(Msg *m)
          116 {
          117         Hdr *h;
          118         int dport, sport;
          119 
          120         if(m->pe - m->ps < ILLEN)
          121                 return -1;
          122         h = (Hdr*)m->ps;
          123         m->ps += ILLEN;
          124 
          125         dport = NetS(h->dport);
          126         sport = NetS(h->sport);
          127         demux(p_mux, sport, dport, m, &dump);
          128 
          129         m->p = seprint(m->p, m->e, "s=%d d=%d t=%s id=%lud ack=%lud spec=%d ck=%4.4ux ln=%d",
          130                         sport, dport, pkttype(h->type),
          131                         (ulong)NetL(h->id), (ulong)NetL(h->ack),
          132                         h->spec,
          133                         NetS(h->sum), NetS(h->len));
          134         return 0;
          135 }
          136 
          137 Proto il =
          138 {
          139         "il",
          140         p_compile,
          141         p_filter,
          142         p_seprint,
          143         p_mux,
          144         "%lud",
          145         p_fields,
          146         defaultframer
          147 };