diff options
author | rsc <devnull@localhost> | 2005-12-26 04:48:52 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-12-26 04:48:52 +0000 |
commit | 87a52e0485d3281ebea6bf4b725aa8023690e96f (patch) | |
tree | 0abc2d2ddb875196177231639d3cb4519e814b9d /src/cmd/ip/snoopy/il.c | |
parent | 35d26aa32167e84326cdb745c0e906393b8de71d (diff) | |
download | plan9port-87a52e0485d3281ebea6bf4b725aa8023690e96f.tar.gz plan9port-87a52e0485d3281ebea6bf4b725aa8023690e96f.tar.bz2 plan9port-87a52e0485d3281ebea6bf4b725aa8023690e96f.zip |
new goodies
Diffstat (limited to 'src/cmd/ip/snoopy/il.c')
-rwxr-xr-x | src/cmd/ip/snoopy/il.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/cmd/ip/snoopy/il.c b/src/cmd/ip/snoopy/il.c new file mode 100755 index 00000000..d75a80cd --- /dev/null +++ b/src/cmd/ip/snoopy/il.c @@ -0,0 +1,146 @@ +#include <u.h> +#include <libc.h> +#include <ip.h> +#include "dat.h" +#include "protos.h" + +typedef struct Hdr Hdr; +struct Hdr +{ + uchar sum[2]; /* Checksum including header */ + uchar len[2]; /* Packet length */ + uchar type; /* Packet type */ + uchar spec; /* Special */ + uchar sport[2]; /* Src port */ + uchar dport[2]; /* Dst port */ + uchar id[4]; /* Sequence id */ + uchar ack[4]; /* Acked sequence */ +}; + +enum +{ + ILLEN= 18, +}; + +enum +{ + Os, + Od, + Osd, +}; + +static Field p_fields[] = +{ + {"s", Fnum, Os, "source port", } , + {"d", Fnum, Od, "dest port", } , + {"a", Fnum, Osd, "source/dest port", } , + {"sd", Fnum, Osd, "source/dest port", } , + {0} +}; + +static Mux p_mux[] = +{ + {"ninep", 17007, }, /* exportfs */ + {"ninep", 17008, }, /* 9fs */ + {"ninep", 17005, }, /* ocpu */ + {"ninep", 17010, }, /* ncpu */ + {"ninep", 17013, }, /* cpu */ + {0}, +}; + +static void +p_compile(Filter *f) +{ + Mux *m; + + if(f->op == '='){ + compile_cmp(udp.name, f, p_fields); + return; + } + for(m = p_mux; m->name != nil; m++) + if(strcmp(f->s, m->name) == 0){ + f->pr = m->pr; + f->ulv = m->val; + f->subop = Osd; + return; + } + sysfatal("unknown il field or protocol: %s", f->s); +} + +static int +p_filter(Filter *f, Msg *m) +{ + Hdr *h; + + if(m->pe - m->ps < ILLEN) + return 0; + h = (Hdr*)m->ps; + m->ps += ILLEN; + + switch(f->subop){ + case Os: + return NetS(h->sport) == f->ulv; + case Od: + return NetS(h->dport) == f->ulv; + case Osd: + return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv; + } + return 0; +} + +char *pktnames[] = +{ + "Sync", + "Data", + "Dataquery", + "Ack", + "Query", + "State", + "Close" +}; + +static char* +pkttype(int t) +{ + static char b[10]; + + if(t > 6){ + sprint(b, "%d", t); + return b; + } + return pktnames[t]; +} + +static int +p_seprint(Msg *m) +{ + Hdr *h; + int dport, sport; + + if(m->pe - m->ps < ILLEN) + return -1; + h = (Hdr*)m->ps; + m->ps += ILLEN; + + dport = NetS(h->dport); + sport = NetS(h->sport); + demux(p_mux, sport, dport, m, &dump); + + m->p = seprint(m->p, m->e, "s=%d d=%d t=%s id=%lud ack=%lud spec=%d ck=%4.4ux ln=%d", + sport, dport, pkttype(h->type), + (ulong)NetL(h->id), (ulong)NetL(h->ack), + h->spec, + NetS(h->sum), NetS(h->len)); + return 0; +} + +Proto il = +{ + "il", + p_compile, + p_filter, + p_seprint, + p_mux, + p_fields, + defaultframer, +}; |